1

我需要使用列定义动态创建 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 

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

4

1 回答 1

2

动态 SQL 确实是您唯一的选择,如果您使用像始终使用quotename(). 唯一的另一个问题是,如果查询增长超过 4000 个字符,在这种情况下,您应该使用nvarchar(max)和使用exec (@query)而不是sp_executesql.

于 2013-06-12T14:26:59.207 回答