插入表格,其中列值以逗号分隔值

时间:2016-08-09 05:58:06

标签: sql-server-2008 stored-procedures

我有以下脚本,我想插入一个表,其中列名可以作为逗号分隔值传递。请提出不同的方法来实现以下输出。

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

1 个答案:

答案 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