从临时表插入添加标识

时间:2017-04-18 15:49:45

标签: sql sql-server tsql identity bulkinsert

我在SQL Server上使用批量插入从csv文件中导入了几行临时表。我必须在临时表上导入,因为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.

2 个答案:

答案 0 :(得分:1)

如果companies.ididentity()列,则无需为该列插入值:

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

如果companies.id不是identity()sequence且默认为next value for,则可以row_number()添加max() id来自companies的{​​1}}:

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

答案 1 :(得分:1)

您无法手动将值插入identity column。这是由系统生成的代理键。只有当您set identity insert为ON时,您才能插入值,但仍然不是整个identity

创建时,您需要将该列id默认为identity。如果该列现在不是标识,则需要重新创建添加了该默认值的表。

更新,因为您已将该列作为identity列,只需跳过插入该列,插入其余字段,即会自动填充id。< / p>