1

1つのIDフィールド(ID)を持つ(tableA)があり、1回の挿入操作で一度に複数の行を挿入する必要があるため、ストアドプロシージャへの受け渡しパラメーターとしてテーブル構造を使用します

挿入されたIDが挿入順序で必要なので、SPで次のクエリを実行しています(tableBはtableAと同じ構造です)。

CREATE PROCEDURE ssp_Test
(
    tableA tableAType
)
AS
BEGIN

INSERT INTO tableB(field1, field2, ...)
OUTPUT INSERTED.ID
SELECT field1, field2, ... from tableA

END

上記の手順を100レコードで実行すると、tableBに挿入された順序で新しいIDフィールドが返されますが、500レコードで実行すると、挿入されたすべてのIDが合理的な順序で返されません。なぜこれが発生するのでしょうか。

そこに配置して並べ替えて返すために別の一時テーブルは必要ありません。なぜそれが発生するのかを知りたいだけです。並べ替えに追加の一時テーブルを使用せずに解決策はありますか?

4

3 に答える 3

3

何かを注文したい場合は、ORDERBY句を使用する必要があります。物理的な順序に依存しようとすることには価値がありません(物理的な順序が存在することがわかっている場合でも(つまり、クラスター化されたインデックスのため)

于 2011-03-05T11:26:02.037 に答える
1

この記事を見てください: http ://technet.microsoft.com/en-us/library/ms177564.aspx

「変更がテーブルに適用される順序と、行が出力テーブルまたはテーブル変数に挿入される順序が一致するという保証はありません」と記載されています。

IDを取得するには、挿入後にselectを使用することをお勧めします。

于 2011-03-05T11:49:24.780 に答える
0

列に数値シーケンスを入力するには、ROW_NUMBER()(またはSQL Server 2012のシーケンス)を使用します。IDENTITY列の動作は常に制御できるとは限らないため、IDENTITY列に依存しようとしないでください。

于 2011-03-06T17:17:05.570 に答える