2017-04-18 120 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