从临时表插入到具有标识列的表

时间:2017-03-21 19:08:57

标签: sql-server tsql insert identity-column

我从表中抓取一些行,在临时表中操作它们,然后将它们作为新行插入到我的原始表中。

但是,即使我的临时表上没有标识列,我也会遇到标识列的问题。标识列是一个自动递增的int。

这似乎是一件很简单的事情,我会过度思考。

select top 0 *
into #TestTable
from OriginalTable;

...
--insert and manipulate records
...

ALTER TABLE #TestTable
DROP COLUMN MyIdentityColumn;

DECLARE @InsertedRows TABLE (NewSeqNum INT);

INSERT INTO OriginalTable
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT * FROM #TestTable

但是我收到了这个错误:

  

表格中的标识列的显式值' OriginalTable'只能在使用列列表且IDENTITY_INSERT为ON时指定。

我绝对不想设置显式值,我希望它插入并给我新的身份(通过@InsertedRows

2 个答案:

答案 0 :(得分:3)

如果您不想保留插入记录的ID,则需要在select中指定所有列但id列。作为一般的良好做法,不要选择*,始终指定要检索的列 - 插入。

INSERT INTO OriginalTable (col1, col2, col3...)
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT (col1, col2, col3...) FROM #TestTable

答案 1 :(得分:1)

如果我理解你,我认为你的问题是你试图在原始表中插入'*' - 这意味着临时表中列的所有。包括您的ID列(您不想插入,因为您希望它自动生成。)

相反,我建议做这样的事情:

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your temp table

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your original table.

... aka,明确拼写列,并省略Identity列。