2017-03-21 6 views
0

テーブルからいくつかの行を取得し、一時テーブルでそれらを操作してから、それらを元のテーブルに新しい行として挿入します。一時テーブルからID列のテーブルへの挿入

しかし、私は自分の一時テーブルにID列がない場合でも、ID列の問題が発生しています。 ID列は自動インクリメント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 

が、私はこのエラーを取得:

An explicit value for the identity column in table 'OriginalTable' can only be specified when a column list is used and IDENTITY_INSERT is ON.

私は絶対に私はそれが(@InsertedRows経由)

+1

*を値として使用しないでください。列を明示的に記述する必要があります。あなたのケースでは、パーサーはすべてのステップを論理的に評価しないので、これは失敗します。 MyIdentityColumnは#TestTableの列であり、挿入しようとしていると考えています。あなたのコードを明示してください。 INSERTステートメントの列と、その値に使用するSELECTステートメントの列を指定します。 –

+0

@SeanLangeには動的な方法がありますか?スキーマからカラム名を選択して、identカラムを削除して、 '*'の代わりにそのカラム名を使用することはできますか? –

+2

列は常に一覧表示する必要があります。列数が多い場合は、SSMSの列「フォルダ」をクエリウィンドウにドラッグできます。明示的にリストされている列以外のものは、遅延があり、表が変更されたときにエラーを起こす傾向があります。 –

答えて

2

を新しいアイデンティティを挿入し、私を与えたい、明示的な値を設定する必要はありません挿入されたレコードのIDを保持しない場合は、すべての列を指定する必要がありますが、selectのid列は指定する必要があります。一般的な良い方法として、select *を使用しないでください。取り出すカラムを指定してください。

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

私はあなたを理解していた場合、私はあなたの問題はあなたが元のテーブルに「*」を挿入しようとしているということだと思う - 一時テーブルからあなたのすべての列を意味しています。あなたのID列(。あなたはそれを自動生成したいとしているので、あなたが、挿入したくないもの)

代わりに、私はこのような何かをやってお勧めしたい含む:

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

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

を..つまり、列を明示的に綴り、Identity列は省略します。

関連する問題