我有以下脚本,我想插入一个表,其中列名可以作为逗号分隔值传递。请提出不同的方法来实现以下输出。
Declare @col_by_source varchar(250) = 's1,s2,s3',
@column_by_target varchar(250) = 'c1,c2,c3',
@SQLString nvarchar(max)
Set @SQLString = 'INSERT INTO [dbo].[sourceTable] (
['+@col_by_source+'] )'
set @SQLString = @SQLString+' '+'SELECT '
Select @SQLString = @SQLString + QUOTENAME(split.a.value('.', 'VARCHAR(100)')) + ' AS '+@col_by_source+','
FROM (SELECT Cast ('<M>' + Replace(@column_by_target, ',', '</M><M>')+ '</M>' AS XML) AS Data) AS A
CROSS apply data.nodes ('/M') AS Split(a);
Set @SQLString = LEFT(@SQLString, LEN(@SQLString) - 1) + ')'
Set @SQLString = @SQLString + 'FROM tableA_source'
print @SQLString
输出:
INSERT INTO [dbo].[sourceTable] (
[s1,s2,s3] ) SELECT [c1] AS s1,s2,s3,[c2] AS s1,s2,s3,[c3] AS s1,s2,s3 FROM tableA_source
预期产出:
INSERT INTO [dbo].[sourceTable] (
[s1,s2,s3] ) SELECT [c1] AS s1, [c2] AS s2,[c3] AS s3
FROM tableA_source
答案 0 :(得分:0)
让它变得简单。在执行insert .... select。时,您不需要别名。
尝试这样,
DECLARE @col_by_source VARCHAR(250) = 's1,s2,s3'
,@column_by_target VARCHAR(250) = 'c1,c2,c3'
,@SQLString NVARCHAR(max)
SET @SQLString = 'INSERT INTO [dbo].[sourceTable] (
' + @col_by_source + ' )'
SET @SQLString = @SQLString + ' ' + 'SELECT '
SELECT @SQLString = @SQLString + QUOTENAME(split.a.value('.', 'VARCHAR(100)')) + ' ,'
FROM (
SELECT Cast('<M>' + Replace(@column_by_target, ',', '</M><M>') + '</M>' AS XML) AS Data
) AS A
CROSS APPLY data.nodes('/M') AS Split(a);
SET @SQLString = LEFT(@SQLString, LEN(@SQLString) - 1) + ''
SET @SQLString = @SQLString + 'FROM tableA_source'
PRINT @SQLString