身份列的显式值?

3
我正在尝试备份我的数据,从我的第一个表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]

) 在 [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) 用于文档名称。真的吗? - Mitch Wheat
3个回答

3
你需要修改你的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

我不太明白你的意思,请你能否澄清一下? - HAJJAJ
不要使用*进行插入,明确列名。 - kaj
@KAJ:我认为你发布的链接说明了它是这样的。 - Mithrandir
好的,我确实尝试过这个 SET IDENTITY_INSERT DocumentManagement.tbDocuments OFF。 - HAJJAJ
你在设置标识插入时的语法是正确的,可以参考http://msdn.microsoft.com/en-us/library/ms188059.aspx。明确声明从DELETED中要插入到其他表中的列。如果这样不起作用,请尝试在使用查询之前将标识插入设置为开启,并将一个测试插入到另一个表中以证明没有其他问题。 - kaj

3
这将解决问题,但我试图使用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

0

简而言之:错误请求的列列表规范是目标表的列列表。在这种情况下,OUTPUT DELETED.* INTO DestinationTable (IdentityColumn, othercolumn, anothercolumn,...),如果您只明确指示源数据中的列而不是使用Deleted.*,它将无法工作。

错误消息说明您必须打开标识插入并指定列列表。问题在于您没有为插入指定列列表。

您可以查看输出子句文档,了解如何在其中指示列列表。在这种情况下,考虑到您自己接受的答案中的列,您的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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接