簡體   English   中英

表中身份列的顯式值錯誤?

[英]Explicit value for the identity column in table error?

我收到以下錯誤消息,我已經調試了兩個身份插入,並且它們執行都沒有問題。 以前有人遇到過此錯誤嗎?有人知道如何解決此問題嗎?

信息8101,第16級,狀態1,第1行
僅當使用列列表且IDENTITY_INSERT為ON時,才能為表'c365online_script1.dbo.tProperty'中的identity列指定一個顯式值。

碼:

declare @Source_Database_Name varchar(255) = 'Production2';
declare @Destination_Database_Name varchar(255) = 'c365online_script1';

declare @Company_Id int = 1 --declare a companyid 

CREATE TABLE #CompanyID (ID bigint)

INSERT INTO #CompanyID(ID)
    VALUES('15')

-- Copy over company records from tCompanytable

--FIRST CURSOR LOOP THROUGH THIS TABLE
CREATE TABLE #TableList (
    processorder int,
    tablename NVARCHAR(100)
    )
INSERT INTO #TableList (processorder, tablename )
VALUES
(1, 'tProperty');

DECLARE @Counter INT = 0  -- counting variable

----------- Cursor specific code starts here ------------
-- company cursor
declare copyCompanyDataCursor CURSOR fast_forward FOR
SELECT ID from #CompanyID;

open copyCompanyDataCursor
fetch next from copyCompanyDataCursor into @Company_Id;

WHILE @@FETCH_STATUS = 0
    BEGIN
        declare @processorder int;
        declare @tablename varchar(500);
        -- table cursor

        declare copyTableDataCursor CURSOR fast_forward FOR
        SELECT processorder,tablename from #TableList order by processorder;

        open copyTableDataCursor
        fetch next from copyTableDataCursor into @processorder, @tablename;

        while @@FETCH_STATUS = 0
        BEGIN
            SET IDENTITY_INSERT [c365online_script1].[dbo].[tCompany] ON

            -- Does the table have a companyID column? if statement checking for company id
            IF EXISTS(SELECT * FROM Production2.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME='CompanyID' and TABLE_NAME=@tablename)
            BEGIN
                if @Counter <= 0 -- make sure loop executes only once.
                BEGIN                   
                declare @debug varchar(max)             
                SET @debug = 'INSERT INTO ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ' WHERE ' + @Source_Database_Name + '.dbo.' + @tablename + '.CompanyID = ' + CAST(@Company_Id as varchar(10))
                print @debug
                set @Counter = 1
                EXEC(@debug)
                --EXEC('INSERT INTO ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ' WHERE ' + @Source_Database_Name + '.dbo.' + @tablename + '.CompanyID = ' + @Company_Id )           
                END             
            END
            ELSE
            BEGIN 
                    Print 'No'
            END 
            -- if yes then copy data based on companyID in cursor  
            -- if no check if this is the first time through company loop and copy all data
            -- if @firstloop company exists look at information schema

                    --EXEC('INSERT INTO ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename )
                    -- company logic


            SET IDENTITY_INSERT [c365online_script1].[dbo].[tCompany] OFF

            FETCH NEXT FROM copyTableDataCursor into @processorder,@tablename;
        END

        close copyTableDataCursor;

        Deallocate copyTableDataCursor;

--INSERT INTO c365online_script1.dbo.tCompany
--SELECT *
--FROM production2.tCompany
--WHERE ISNULL(CompanyID, 0) = 0  -- copy all data where id is equal to zero
--@Destination_Database_Name

--      
        --EXEC(INSERT  + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ' WHERE ' + @Source_Database_Name + '.dbo.' + @tablename + '.CompanyID = ' + @Company_Id + ')')     
        --SET @firstLoop = false;
        FETCH NEXT FROM copyCompanyDataCursor into @Company_Id;
    END

CLOSE copyCompanyDataCursor;
DEALLOCATE copyCompanyDataCursor;


--Cleanup
DROP TABLE #CompanyID
DROP TABLE #TableList

好吧,錯誤說明了一切:

當使用列列表且IDENTITY_INSERT為ON 時,才能為表'c365online_script1.dbo.tProperty'中的identity列指定一個顯式值。

因此,您的INSERT語句必須使用列列表!

采用

INSERT INTO dbo.Table(col1, col2, ...., colN) VALUES(Val1, val2, ...., ValN)

而不僅僅是

INSERT INTO dbo.Table   VALUES(Val1, val2, ...., ValN)
                     ^^^^  no column list defined!! 

這樣就可以了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM