我需要使用列定义动态创建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
无论如何,我对这个解决方案感到不舒服,因为我正在构建一个字符串,之后会被执行。我正在寻找一个直接执行查询的解决方案。有什么建议吗?
答案 0 :(得分:2)
动态SQL确实是您唯一的选择,如果您使用诸如始终使用quotename()
之类的良好做法,它将是安全可靠的。唯一的另一个问题是,如果查询增长超过4000个字符,在这种情况下,您应该使用nvarchar(max)
并使用exec (@query)
代替sp_executesql
。