我正在运行SQL Server2008。在存储过程中,我需要通过从TableA的列子集中制作逗号分隔的字符串来将TableA复制到TableB,并将其与其他数据一起写入TableB。
TableA包含名为“ Column1”至“ Column12”的12个文本列。
对于TableA中的每一行,我需要一个逗号分隔的字符串,该字符串由传递给存储过程的参数@startCol和@endCol定义的可变列范围构建而成。我需要将@startCol和@endCol加上字符串复制到另一个表中。
表B:StartCol,EndCol,逗号
这是我正在尝试的:
INSERT INTO TableB SELECT @startCol as StartCol, @endCol As EndCol, COALESCE(???) as CommaDelim
我不知道该如何传递给COALESCE函数。我什至不确定我应该使用COALESCE。我不反对动态SQL
表A:
Column1 Column2 Column3 …. 'A1' 'A2' 'A3' 'B1' 'B2' 'B3'
。。。
我在TableB中想要的是
StartCol EndCol CommaDelim 1 3 'A1,A2,A3' 1 3 'B1,B2,B3'
TableA中的每个记录一个记录
我无法获得任何结果集-我在COALESCE部分中不断收到语法错误
也许有些过分开发了,但是这是一种不需要动态SQL的技术
注意,我将“列”设置为1和2之间,但您可以设置任何范围
例
Declare @YourTable Table ([Column1] varchar(50),[Column2] varchar(50),[Column3] varchar(50)) Insert Into @YourTable Values ('A1','A2','A3') ,('B1','B2','B3') Declare @Col1 int = 1 Declare @Col2 int = 2 Select StartCol = @Col1 ,EndCol = @Col2 ,C.* From @YourTable A Cross Apply ( values (cast((Select A.* for XML RAW,ELEMENTS XSINIL) as xml))) B(XMLData) Cross Apply ( values (stuff((Select ',' + Value From ( Select Seq = row_number() over (order by (select null)) ,Item = a.value('local-name(.)','varchar(100)') ,Value = a.value('.','varchar(max)') From B.XMLData.nodes('/row') as C1(n) Cross Apply C1.n.nodes('./*') as C2(a) ) B1 Where Seq between @Col1 and @Col2 Order By Seq For XML Path ('')) ,1,1,'') ) ) C(CommaDelim)
退货
StartCol EndCol CommaDelim 1 2 A1,A2 1 2 B1,B2