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