sql - 如何在作为变量传递的表名上设置identity_insert

标签 sql sql-server sql-server-2008 sql-server-2012

我的数据库名称位于 @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/

相关文章:

mysql - 这个查询真的不安全吗?

sql - 获取游戏计数并显示玩了一半游戏的玩家

php - INT(10) 和 INT(12) 之间有什么区别(应用于我的代码时)?

sql-server - RODBC 将 float 作为 SQL Server 中的字符

sql - 当列类型为 nvarchar 时,将表与列值的总和一起旋转

C#/SQL 服务器 : "Error Locating Server/Instance Specified" in just one application

php - 如何将动态参数传递给查询?

c# - 每个月有两个日期的日子

sql - 为什么 "0D0"在 SQL Server 2008 中被视为数字?

sql-server-2008 - 比较 2 个表的值并列出不同的行