2

私は3つのテーブルを持っています

  • Table_Aたくさんの行があります
  • Table_Bどこからのデータで行が挿入されるかTable_A
  • Table_Cと呼ばれる数 (整数) を保持しますcode_number

sp_getNextCode現在のcode_numberfromを選択し、この番号 (のようなもの) でコード文字列をTable_C作成して返し、次の値 ( )で更新するストアド プロシージャ ( ) があります。varcharyyyyMMdd + cast(code_number as varchar)Table_C code_numbercode_number+1

ここまでは順調ですね。

今、私はCURSOR を使用せ ずに からTable_Aまでの行を挿入したいと思いますTable_B

INSERT INTO TABLE_B 
    SELECT .... FROM TABLE_A 

繰り返しますが、これまでのところとても良いです

問題は、上記の挿入ステートメントの値の 1 つがストアド プロシージャの出力でなければならないことsp_getNextCodeです。

  • ステートメントでストアド プロシージャを使用できません
  • 関数が持つことができないのと同じコードで関数を作成することはsp_getNextCodeできませんINSERT/UPDATE/DELETE

SQL Server 2012 (シーケンスがある) のオプションはありません。SQL Server 2008 のみです。

これを達成する方法はありますか、それとも唯一の方法はカーソルを使用することです(カーソルを避けたいのは、挿入する必要がある何千もの行について話していて、時間がかかりすぎるためです)

4

1 に答える 1

1

確かに方法はあります: table_A から読み取るストアド プロシージャを作成し、ino table_b を挿入し、table_C を更新します。

BEGIN TRANSACTION

SELECT @last_value=last_vale FROM  Table_C;

SELECT @records_to_insert = COUNT(*) 
FROM Table_A
WHERE <Conditions>

INSERT INTO TABLE_A
SELECT <Fields>,...., @last_value + ROW_NUMBER() 
OVER(ORDER BY <some ordering criteria>)
FROM TABLE_A
WHERE <Conditions>

UPATE Table_C
SET last_value = @last_value + @records_to_insert +1

COMMIT TRANSACTION

数値の書式化されたコードへの変換、例外処理、およびロールバックなどの詳細は省略していますが、理解していただければ幸いです。

トリックは、ROW_NUMBER() OVER (ORDER BY...) 関数を使用して、各行の一意の番号を取得することです。

http://msdn.microsoft.com/en-us/library/ms186734.aspx

于 2012-08-22T12:41:25.437 に答える