如何在INSERT INTO查询中使用SUBSTRING的结果作为列定义?

时间:2013-06-12 13:55:47

标签: sql tsql subquery substring

我需要使用列定义动态创建INSERT INTO语句,以防止出现IDENTITY_INSERT问题。我已经找到了如何检索表的列列表以及一种方法,将它们放在一起。

DECLARE @Query nvarchar(4000)
DECLARE @columnlist nvarchar(4000)

// Result of this query e.g.: "[cid], [pid], [nid], [uid], [subject]"
SET @columnlist = (SELECT SUBSTRING((SELECT ', ' + QUOTENAME(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_NAME = 'from_table' ORDER BY ORDINAL_POSITION FOR XML path('')), 3,  200000))

SET @query ='INSERT INTO to_table (' + @columnlist + ')  SELECT  ' + @columnlist + ' FROM from_table;'
exec sp_executesql @query 

无论如何,我对这个解决方案感到不舒服,因为我正在构建一个字符串,之后会被执行。我正在寻找一个直接执行查询的解决方案。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

动态SQL确实是您唯一的选择,如果您使用诸如始终使用quotename()之类的良好做法,它将是安全可靠的。唯一的另一个问题是,如果查询增长超过4000个字符,在这种情况下,您应该使用nvarchar(max)并使用exec (@query)代替sp_executesql