2017-04-18 93 views
0

我已經在csv文件中使用SQL Server上的批量插入在臨時表中導入了多行。我不得不導入臨時表,因爲CSV文件中沒有主鍵ID。從臨時表插入添加標識

現在我想在真實表上傳輸數據;但我不能,因爲我找不到添加id的方式。

我曾嘗試:

INSERT INTO companies (id, code, name, vat_code, ce_vat_code, fiscal_code, 
    address, zip_code) 
SELECT IDENTITY(INT) AS id, code, name, vat_code, ce_vat_code, 
    fiscal_code, address, zip_code 
FROM temp_companies 

,但我得到這個錯誤:

The IDENTITY function can only be used when the SELECT statement has an INTO 
clause. 
+0

是'companies.id'已經是'identity()'列嗎? – SqlZim

+0

是的,在創建語句:id BIGINT IDENTITY(1,1)NOT NULL, – Argentina

+0

不應該選擇它然後,將得到自動填充 –

回答

1

如果​​是identity()列,你並不需要插入值,該列:

INSERT INTO companies (code, name, vat_code, ce_vat_code, fiscal_code, address, zip_code) 
SELECT code, name, vat_code, ce_vat_code, fiscal_code, address, zip_code 
FROM temp_companies 

如果​​不是identity()sequencenext value for默認,你可以從companies添加row_number()max()id

INSERT INTO companies (id, code, name, vat_code, ce_vat_code, fiscal_code, address, zip_code) 
SELECT m.maxid + row_number() over (order by (select 1)) 
    , code, name, vat_code, ce_vat_code, fiscal_code, address, zip_code 
FROM temp_companies 
cross join (select max(id) as maxid from companies) m 
+0

我試過第二個選項,(我錯了,公司表沒有id設置爲身份())。但是我得到以下錯誤:'無效的列名'id'. – Argentina

+0

@阿根廷更新到按'(select 1)''row_number()' – SqlZim

1

您不能手動該值插入identity column。這是由系統生成的代理鍵。只有當你set identity insert ON,那麼你可以插入值,但仍然不是全部identity

創建它時,需要將該列id默認爲identity。如果該列現在不是標識,則需要重新創建添加了該默認值的表。

UPDATE既然你已經有這樣的列identity列,只需跳過插入欄,加入的申請休息,那id將自動填充。

+0

實際上你可以插入標識值,如果你設置IDENTITY_INSERT ON表。 https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql它不是代理鍵。如果該列允許重複,則沒有任何說明身份必須是唯一的。當然,大多數情況下,我們將這組作爲主鍵。 –

+0

thx @SeanLange,對於第一部分,我做了metaioned xD,感謝您糾正我後面的部分 – LONG