如何在作为变量传递的表名上设置identity

如何在作为变量传递的表名上设置identity

我在@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)

关于sql - 如何在作为变量传递的表名上设置identity_insert,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29832709/

10-11 00:12