【问题标题】:Database-wide equivalent of SET IDENTITY_INSERT OFFSET IDENTITY_INSERT OFF 的数据库范围等效项
【发布时间】:2008-10-23 16:26:39
【问题描述】:

在我的eternalsaga 中,为了从 SQL 脚本中插入 140 万行数据,我编写了一个基本的 WinForms 应用程序,它获取脚本的每一行并单独执行。

但是,因为原始脚本包含

SET IDENTITY_INSERT [Table] OFF

而且 SET 是一个会话范围的命令,这个设置在每次 SQL 调用时都会丢失,这意味着每一行都失败了。有没有办法在整个数据库范围内为整个表设置 IDENTITY_INSERT 以便我可以在不失败的情况下进行这些单独的调用?或者我可以通过在每一行附加一个命令来告诉它忽略身份规范?

【问题讨论】:

    标签: sql-server identity identity-insert


    【解决方案1】:

    BULK INSERT 不适合你?还是 SQL Server 导入/导出向导(herehere)?我知道导入/导出可以关闭整个导入的身份插入。我有理由确定您可以在 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 列上的标识?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        • 2011-08-13
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多