SET IDENTITY_INSERT OFF 的数据库范围等效项
Posted
技术标签:
【中文标题】SET IDENTITY_INSERT OFF 的数据库范围等效项【英文标题】:Database-wide equivalent of SET IDENTITY_INSERT OFF 【发布时间】:2008-10-23 16:26:39 【问题描述】:在我的eternalsaga 中,为了从 SQL 脚本中插入 140 万行数据,我编写了一个基本的 WinForms 应用程序,它获取脚本的每一行并单独执行。
但是,因为原始脚本包含
SET IDENTITY_INSERT [Table] OFF
而且 SET 是一个会话范围的命令,这个设置在每次 SQL 调用时都会丢失,这意味着每一行都失败了。有没有办法在整个数据库范围内为整个表设置 IDENTITY_INSERT 以便我可以在不失败的情况下进行这些单独的调用?或者我可以通过在每一行附加一个命令来告诉它忽略身份规范?
【问题讨论】:
【参考方案1】:BULK INSERT 不适合你?还是 SQL Server 导入/导出向导(here 或 here)?我知道导入/导出可以关闭整个导入的身份插入。我有理由确定您可以在 BULK INSERT 之前做到这一点
【讨论】:
您可能还想查看执行此操作的 bcp 实用程序,它是专门为此任务设计的。 msdn.microsoft.com/en-us/library/ms162802.aspx bcp 有一个命令行选项,可以使用导入数据中的指定文件覆盖标识列。 我最终不得不将我的 SQL 脚本转换为一个以制表符分隔的平面文件,然后使用 bcp 来导入它。这比原本应该的麻烦多了!【参考方案2】:我相信 IDENTITY INSERT 在每个会话中一次只能覆盖一个表。
您可能必须一次批处理 2 或 300 个插入语句,并在每个批处理之前加上 ident 插入。
所以应用程序将执行这样的块......
SET IDENTITY_INSERT [Table] OFF;
INSERT INTO TABLE VALUES (1, 'a');
INSERT INTO TABLE VALUES (2, 'b');
INSERT INTO TABLE VALUES (3, 'c');
INSERT INTO TABLE VALUES (4, 'd');
INSERT INTO TABLE VALUES (5, 'e');
SET IDENTITY_INSERT [Table] ON;
【讨论】:
【参考方案3】:当这 140 万个插入作业正在进行时,是否还有其他内容要访问/插入到表中。
如果没有,您可以简单地在作业期间禁用 PK 列上的标识?
【讨论】:
以上是关于SET IDENTITY_INSERT OFF 的数据库范围等效项的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver中set IDENTITY_INSERT on 和 off 的设置方法
SET IDENTITY_INSERT OFF 的数据库范围等效项
DBCC CHECKIDENT 和SET IDENTITY_INSERT table OFF