【问题标题】:An explicit value for the identity column?标识列的显式值?
【发布时间】:2019-12-03 00:51:00
【问题描述】:

我正在尝试从我的第一个表 DocumentManagement.tbDocumentsHistory 中备份我的数据并将其保存在 DocumentManagement.tbDocuments 上

并且由于 DocumentManagement.tbDocuments 具有 ID IDENTITY_INSERT 列,因此将引发此错误

只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“DocumentManagement.tbDocuments”中的标识列指定显式值。

当我使用这个代码时

DELETE FROM DocumentManagement.tbDocumentsHistory
OUTPUT DELETED.* INTO DocumentManagement.tbDocuments 
FROM    DocumentManagement.tbDocumentsHistory
WHERE   DocumentID=@DocumentID

我尝试使用此代码关闭 DocumentManagement.tbDocuments 上的 IDENTITY_INSERT

SET IDENTITY_INSERT DocumentManagement.tbDocuments ON 
        DELETE FROM DocumentManagement.tbDocumentsHistory
            OUTPUT DELETED.* INTO DocumentManagement.tbDocuments 
            FROM    DocumentManagement.tbDocumentsHistory
        WHERE   DocumentID=@DocumentID
        SET IDENTITY_INSERT DocumentManagement.tbDocuments OFF

我仍然面临同样的错误!

我的表格描述:

CREATE TABLE [DocumentManagement].[tbDocuments](
[DocumentID] [bigint] IDENTITY(1,1) NOT NULL,
[DocumentNameEn] [nvarchar](max) NULL,
[DocumentNameAr] [nvarchar](max) NULL,
[DocumentDescriptionEn] [nvarchar](max) NULL,
[DocumentDescriptionAr] [nvarchar](max) NULL,
[CreatedOn] [datetime2](7) NULL,
[ModifiedOn] [datetime2](7) NULL,
[AddedBy] [bigint] NULL,
[modifaiedBy] [bigint] NULL,
[PhysicalName] [nvarchar](max) NULL,
[Extension] [nvarchar](15) NULL,
[DocumentTypeID] [bigint] NULL,
[PhysicalPath] [nvarchar](max) NULL,


CONSTRAINT [PK_tbDocuments] PRIMARY KEY CLUSTERED([DocumentID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) 开启 [主要]

CREATE TABLE [DocumentManagement].[tbDocumentsHistory](
[DocumentID] [bigint] NOT NULL,
[DocumentNameEn] [nvarchar](max) NULL,
[DocumentNameAr] [nvarchar](max) NULL,
[DocumentDescriptionEn] [nvarchar](max) NULL,
[DocumentDescriptionAr] [nvarchar](max) NULL,
[CreatedOn] [datetime2](7) NULL,
[ModifiedOn] [datetime2](7) NULL,
[AddedBy] [bigint] NULL,
[modifaiedBy] [bigint] NULL,
[PhysicalName] [nvarchar](max) NULL,
[Extension] [nvarchar](15) NULL,
[DocumentTypeID] [bigint] NULL,
[PhysicalPath] [nvarchar](max) NULL, CONSTRAINT [PK_tbDocumentsHistory] PRIMARY KEY CLUSTERED([DocumentID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

【问题讨论】:

  • nvarchar(max) 用于文档名称。认真的吗?

标签: sql-server sql-server-2008


【解决方案1】:

这将解决问题,但我试图使用 OUTPUT 使其更好

SET IDENTITY_INSERT DocumentManagement.tbDocuments ON
        INSERT INTO DocumentManagement.tbDocuments
                ( DocumentID, DocumentNameEn , DocumentNameAr , DocumentDescriptionEn ,
                  DocumentDescriptionAr , CreatedOn , ModifiedOn ,
                  AddedBy , modifaiedBy , PhysicalName ,Extension ,
                  DocumentTypeID ,PhysicalPath
                )   
        SELECT * FROM  DocumentManagement.tbDocumentsHistory
        SET IDENTITY_INSERT DocumentManagement.tbDocuments OFF

        DELETE FROM DocumentManagement.tbDocumentsHistory           
        FROM    DocumentManagement.tbDocumentsHistory
        WHERE   DocumentID=@DocumentID

【讨论】:

    【解决方案2】:

    您需要修改您的 INSERT 语句并添加一个包含标识列名称的列列表才能使用。

    任何使用身份插入的 INSERT 语句都需要一个列列表,如下所示:

    CREATE TABLE dbo.Tab 
    (
       ID INT IDENTITY NOT NULL PRIMARY KEY, 
       Name VARCHAR(40) NOT NULL
    )
    
    SET IDENTITY_INSERT dbo.Tab ON
    GO
    
    INSERT INTO dbo.Tab (ID, Name) VALUES (3000, 'Groucho')
    GO
    
    SET IDENTITY_INSERT dbo.Tab OFF
    

    【讨论】:

    • 我没有完全理解你的意思,请你澄清一下。
    • 不要使用 * 插入,明确说明列名
    • @KAJ:我认为您发布的链接说明了 id。
    • 好的,我确实试过这个 SET IDENTITY_INSERT DocumentManagement.tbDocuments OFF
    • 根据msdn.microsoft.com/en-us/library/ms188059.aspx,您的集合标识插入语法是正确的。明确说明要插入到另一个表中的 DELETED 列。如果这不起作用,请尝试在表中进行测试插入,并将设置标识插入与您的查询分开,以证明没有其他问题
    【解决方案3】:

    TL;DR: 错误请求的列列表规范是目标表的列列表。在这种情况下,OUTPUT DELETED.* INTO DestinationTable (IdentityColumn, othercolumn, anothercolumn,...),如果您只是明确指出源数据中的列而不是执行Deleted.*,它将不起作用。

    错误消息指出您必须打开身份插入并指定列列表。问题在于您没有为插入指定列列表。

    您可以查看output clause documentation 以了解您如何在此处指定列列表。在这种情况下,考虑到您自己接受的答案中的列,您的 sql 代码将类似于:

    DELETE FROM DocumentManagement.tbDocumentsHistory
    OUTPUT DELETED.DocumentID, DELETED.DocumentNameEn, Deleted.DocumentNameAr,
    Deleted.DocumentDescriptionEn, Deleted.DocumentDescriptionAr, Deleted.CreatedOn, 
    Deleted.ModifiedOn, Deleted.AddedBy, Deleted.modifaiedBy, Deleted.PhysicalName, 
    Deleted.Extension, Deleted.DocumentTypeID, Deleted.PhysicalPath  INTO DocumentManagement.tbDocuments
    ( 
                      DocumentID, DocumentNameEn , DocumentNameAr , DocumentDescriptionEn ,
                      DocumentDescriptionAr , CreatedOn , ModifiedOn ,
                      AddedBy , modifaiedBy , PhysicalName ,Extension ,
                      DocumentTypeID ,PhysicalPath
    )
    FROM    DocumentManagement.tbDocumentsHistory
    WHERE   DocumentID=@DocumentID 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 2017-12-31
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多