我在@strDBName中有数据库名称.我构建了SET IDENTITY_INSERT并执行它.没有错误,但后续插入失败.下面的代码说明了这个问题.
Declare @Query Varchar(MAX)
SET @Query = 'SET IDENTITY_INSERT '+ @strDBName +'..TableName ON'
EXEC(@Query)
INSERT INTO [TableName] ... (MAX) Value from another table and other applicable record.
SET @Query = 'SET IDENTITY_INSERT '+ @strDBName +'..TableName OFF'
EXEC(@Query)
最佳答案 只是为了备份Brad在评论中给出的答案,这里是一个在单个动态查询中完成整个插入序列的MVCE.根据Kris的评论,确保数据库名称是白名单,因为查询容易受到SqlInjection的攻击(遗憾的是,数据库名称无法通过sp_executesql在动态sql中参数化)
鉴于:
CREATE TABLE TableName
(
ID INT IDENTITY(1,1)
);
可以执行单个批次:
DECLARE @strDBName VARCHAR(100) = 'MyDatabase';
Declare @Query Varchar(MAX)
SET @Query = 'SET IDENTITY_INSERT '+ @strDBName +'..TableName ON; '
SET @Query = @Query + 'INSERT INTO '+ @strDBName
+'..[TableName](ID) SELECT COALESCE(MAX(ID), 0)+1 FROM '+ @strDBName +'..TableName; '
SET @Query = @Query + 'SET IDENTITY_INSERT '+ @strDBName +'..TableName OFF;'
EXEC(@Query)