2013-10-31 31 views
0

我得到了下面的錯誤信息,我調試了這兩個身份插入,他們執行沒有問題。有沒有人遇到過這個錯誤之前,有誰知道如何解決這個問題?表錯誤中標識列的顯式值?

消息8101,級別16,狀態1,行1
當使用列列表只能指定表「c365online_script1.dbo.tProperty」的標識列一個明確的價值和IDENTITY_INSERT爲ON。

代碼:

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 [email protected]) 
      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 
[email protected]_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 
+0

當將字面值插入到具有bigint列的表中時,請不要**使用字符串引號!這是完全無用的,只是會導致不必要的轉換 - 使用此代碼:INSERT INTO #CompanyID(ID)VALUES(15)'(而不是'... VALUES('15')') –

回答

4

那麼,錯誤說明了一切:

只能指定表 'c365online_script1.dbo.tProperty' 的標識列的顯式值當使用列表列表且IDENTITY_INSERT爲ON時。

所以你INSERT聲明MUST使用列列表!

使用

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

並不僅僅是

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

然後它會工作!

+0

嗨,但是對於插入語句我正在使用一個列表「INSERT INTO #TableList(processorder,tablename)VALUES (1,'tProperty');」 – user1259076

+0

@ user1259076:是的,對於你的最後一條語句是真的,但是對於你在兩個嵌套遊標中動態構造的語句而言,NOT NOT ** ...... –

+0

好吧,我不太清楚這個語句怎麼會在一起 – user1259076

相關問題