我从表中抓取一些行,在临时表中操作它们,然后将它们作为新行插入到我的原始表中。
但是,即使我的临时表上没有标识列,我也会遇到标识列的问题。标识列是一个自动递增的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
)
答案 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列。