【问题标题】:Set IDENTITY_INSERT ON is not working设置 IDENTITY_INSERT ON 不起作用
【发布时间】:2012-08-13 22:20:00
【问题描述】:

我想将一个表Equipment 从一个数据库MyDBQA 复制到我们的测试数据库MyDB。表中有一个标识列,它是主键(int,not null)。

但我得到了一个错误:

消息 8101,第 16 级,状态 1,第 2 行
表“MyDB.dbo.Equipment”中标识列的显式值只能在使用列列表时指定 并且 IDENTITY_INSERT 为 ON。

我的脚本:

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON
INSERT INTO [MyDB].[dbo].[Equipment]  SELECT * FROM [MyDBQA].[dbo].[Equipment]
SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF

【问题讨论】:

标签: sql-server sql-server-2008 tsql


【解决方案1】:

如消息所示,您可能只是缺少列列表

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON

INSERT INTO [MyDB].[dbo].[Equipment]
            (COL1,
             COL2)
SELECT COL1,
       COL2
FROM   [MyDBQA].[dbo].[Equipment]

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF 

【讨论】:

    【解决方案2】:

    错误信息的相关部分是

    ...when a column list is used...
    

    您使用的不是列列表,而是SELECT *。改为使用列列表:

    SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON 
    
    INSERT INTO [MyDB].[dbo].[Equipment] (Col1, Col2, ...)
    SELECT Col1, Col2, ... FROM [MyDBQA].[dbo].[Equipment] 
    
    SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF 
    

    【讨论】:

    • Col1 可以是标识列吗?
    • 是的。 (还需要 10 个字符)
    【解决方案3】:

    在 VB 代码中,当尝试提交 INSERT 查询时,您必须在同一个 'executenonquery' 中提交双重查询,如下所示:

    sqlQuery = "SET IDENTITY_INSERT dbo.TheTable ON; INSERT INTO dbo.TheTable (Col1, COl2) VALUES (Val1, Val2); SET IDENTITY_INSERT dbo.TheTable OFF;"
    

    我使用了; 分隔符而不是 GO。

    为我工作。迟到但有效率!

    【讨论】:

    • 伙计,你甚至不知道你在这个问题上帮了我多少!不是 VB,而是 Node.js 和我尝试了事务,使用 GO,但这些都没有帮助...感谢您在找了 3 个小时后终于帮助了我!
    • 这也是我的问题的答案!非常感谢
    【解决方案4】:

    这是 Microsoft 关于使用 SET IDENTITY_INSERT 的文章,如果其他人像我一样在尝试重新创建已删除的记录同时保持原始标识列值时发现这篇文章,这可能会对看到这篇文章有所帮助。

    使用原始标识列值重新创建已删除的记录: http://msdn.microsoft.com/en-us/library/aa259221(v=sql.80).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多