如何使用动态列

时间:2017-01-23 18:14:28

标签: sql-server tsql

我希望能够将表中的所有记录都抓取到逗号分隔列表中,然后我可以使用该列表将其插入到另一个数据库的表中。由于客户服务器的权限限制,我在右键单击数据库名称时无法访问任何选项,到目前为止我找到的所有解决方案都涉及获得许可(例如任务) >导出数据...)

我尝试使用COALESCE来执行此操作,但问题是我的表可以包含任意数量的列。用户可以随时通过UI添加/删除列,因此我无法对select语句中的列进行硬编码。

这是我到目前为止所写的内容,使用一个简单的CTE语句,其中有三列(RowCode,RowOrd,RowText)并将它们连接成我打印出来的变量。我只是想找到一种方法来动态获取这些列名,而不是硬编码。我还需要考虑各种类型的列名,方法是将它们分别作为varchar添加到变量中。

DECLARE @listStr VARCHAR(MAX)

;WITH tableData AS
(
    SELECT * 
    FROM tableRows
)
SELECT 
    @listStr = ISNULL(@listStr + 'select ','select ') + '''' + RowCode + ''',''' + cast(RowOrd as varchar) + ''',''' + RowText + '''' + Char(13) 
FROM 
    tableData

PRINT @listStr

tableRows表包含以下记录

RowCode RowOrd  RowText
-----------------------
RowA    1       Row A
RowB    2       Row B

变量@listStr当前正在打印这个,这是正确的

select 'RowA','1.00','Row A'
select 'RowB','2.00','Row B'

提前致谢!

1 个答案:

答案 0 :(得分:2)

使用一点XML,您可以动态收集和"字符串化"你的价值观

Declare @tableRows  table (RowCode varchar(50), RowOrd  int, RowText varchar(50))
Insert Into @tableRows  values
('RowA',1,'Row A'),
('RowB',2,'Row B')

Declare @listStr VARCHAR(MAX) = ''

Select @listStr = @listStr + C.String + char(13)
 From  @tableRows A
 Cross Apply (Select XMLData = cast((Select A.* for XML RAW) as xml)) B
 Cross Apply (
              Select String = 'select '+Stuff((Select ',' +Value 
               From  (
                        Select Value  = ''''+attr.value('.','varchar(max)')+''''
                         From  B.XMLData.nodes('/row') as A(r)
                         Cross Apply A.r.nodes('./@*') AS B(attr)
                     ) X
               For XML Path ('')),1,1,'') 
             ) C

Select @listStr

返回

select 'RowA','1','Row A'
select 'RowB','2','Row B'