我在中有数据库名称@strDBName。我构建SET IDENTITY_INSERT并执行它。没有错误,但是随后的插入失败。下面的代码说明了该问题。
@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的影响(不幸的是,数据库名称不能通过来在动态sql中进行参数化sp_executesql)
sp_executesql
鉴于:
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)