2010-12-27 18 views
3

午後、SQLサーバー複数の行を挿入し、int列をインクリメントする

私はテーブルにいくつかの行があり、別のテーブルにそれらを転送する必要があります。

宛先テーブルでは、増分値でフィールドを追加する必要もあります。

私はこの方法でやっているが、インクリメントされた値(intCodInterno)は常に同じであるので、私は、挿入で何かが間違っていることを知っている:

INSERT INTO Emp_VISOT.dbo.TBL_GCE_ARTIGOS 
     (strCodigo , 
      strDescricao , 
      intCodInterno , 
      intCodTaxaIvaCompra , 
      intCodTaxaIvaVenda , 
      strCodCategoria , 
      strAbrevMedStk , 
      strAbrevMedVnd , 
      strAbrevMedCmp , 
      bitAfectaIntrastat 
     )(
     SELECT A.Artigo , 
       a.Descricao , 
       IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1, 
       '3' , 
       '3' , 
       '1' , 
       'Un' , 
       'Un' , 
       'Un' , 
       '0' 
     FROM PRIVESAM.DBO.Artigo A) 

は私が何が必要です値が正しいように変更するように変更しますか?

ありがとうございます。

EDIT:

私は、クエリの小さな変化をした、と今では動作します。 私は括弧内IDENT_CURRENTでSELECTを挿入します。

(SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1) 

私はiをインクリメント値で新しい、古いテーブルから必要なすべての行を得ました。

ありがとうございました。

+0

'IDENT_CURRENT'を使用すると、そのテーブルに' IDENTITY'カラムがあることを意味します。 INSERTが起きたときに 'IDENTITY'カラムが自動的に新しい一意の値を取得します.... –

答えて

3

IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1 クエリを実行するときに1回評価され、すべての行が同じIDを取得します。

最初のソリューションは、カーソルのように構築するか、全くとインクリメントインデックスを挿入ループにより選択結果を反復することである(あなたがそれを行う)

第二の溶液は、宛先表にidentity

+0

残念ながら、宛先テーブルにはすでに存在していますIDENTITYの列。 –

+0

その列の値をintCodInterno列の値、sthを永続化された計算列のように使用する方法を探します。 –

3

をその列を作ることですintCodInternoで部品を削除し、SQL ServerでIdentity propertyを使用して自動的にインクリメントします。

2

IDENT_CURRENTは、トランザクションがコミットするまで更新されないため、挿入するまで値は一定のままです。

  1. カウンタのいくつかの種類(@newRowNum)など+1、あなたのSELECTクエリの行ごとに、@newRowNum = @newRowNumそれを使用し、したがって、あなた:ここ

    は、この問題を修正するための3つのオプションがありますintCodInterno number = IDENT_CURRENT()+ @newRowNum。これにはおそらく多くのハッキングが必要です。それをお勧めしないでください。

  2. 今までと同じビジネスロジックを使用して行を順番に挿入します。ただし、パフォーマンスは大幅に低下します。それをお勧めしないでください。

  3. 宛先表のその列をID列自体に設定します。これははるかに良い方法です。

カスタム恒等関数を(私はあなたが今、ID列を使用していない理由がありますと仮定)が必要な場合、あなたは上記の手順のいくつかを使用して作成することができます:私はhttp://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

0

case、i同じビジネスロジックを使用して行を順番に挿入しました。古いデータをこの列にもインポートする必要があるため、自動インクリメントは使用できません。データをインポートしたら、自動増分のために列を更新するために行くかもしれません。

関連する問題