【问题标题】:IDENTITY_INSERT ON not working - SQL Server 2008 R2IDENTITY_INSERT ON 不起作用 - SQL Server 2008 R2
【发布时间】:2014-08-19 03:02:24
【问题描述】:

我的查询有问题。 基本上,我要做的是清空一个表并从另一个数据库中的同一个表中复制记录。

我确实使用了SET IDENTITY_INSERT 代码来确保在执行插入之前关闭标识列。但不知何故,它仍然向我抛出错误消息:

消息 8101,第 16 级,状态 1,第 3 行
只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 'dbo.UI_PAGE' 中的标识列指定显式值。

以下是我的查询:

DELETE FROM [DB1].[dbo].[MY_TABLE] 

SET IDENTITY_INSERT [DB1].[dbo].[MY_TABLE] ON

INSERT INTO [DB1].[dbo].[MY_TABLE]
   SELECT *
   FROM  [DB2].[dbo].[MY_TABLE]

SET  IDENTITY_INSERT [DB1].[dbo].[MY_TABLE] OFF

谁能指出我做错了哪一步?

非常感谢!

【问题讨论】:

    标签: sql-server-2008-r2 identity identity-column


    【解决方案1】:

    在使用 INSERT INTO 时,使用 IDENTITY INSERT ON 插入时,您必须指定所有列名

    INSERT INTO  [DB1].[dbo].[MY_TABLE](TabelID,Field1,Field2,Field3...)
    SELECT * FROM  [DB2].[dbo].[MY_TABLE]
    

    如果您不知道 ssms 中有一个漂亮的小技巧。如果选择一个表并展开它的节点,您可以 ctrl-c 复制到 Columns 节点,这将在剪贴板文本缓冲区中放置一个以逗号分隔的字段名称列表。

    【讨论】:

    • 我什至建议始终明确列出所有INSERT AND SELECT 语句中的列。前面的输入要多一些,但它会避免很多、难以发现的问题和错误!
    【解决方案2】:

    除了罗斯布什给出的第一个答案, 如果您的表有很多列,则使用此命令获取这些列的名称。

    SELECT column_name + ','
    FROM   information_schema.columns 
    WHERE  table_name = 'TableName'
    for xml path('')
    

    (删除最后一个逗号(',')后)只需复制过去的列名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多