3

テーブル変数に挿入された sproc 値が挿入とは異なる順序で記述されていることに気付きました。並べ替え用に別の列を追加せずに、この自動並べ替えを無効にする方法はありますか? 頭に浮かぶアイデアは、作成中の自動インデックスまたは何らかの照合設定です... 何かアイデアはありますか?

http://sqlfiddle.com/#!3/e1c06/13にアクセスして、私が何を意味するかを正確に確認してください

declare @tmpTbl table (name varchar(100))
insert into @tmpTbl
select 'mark'
union
select 'frank'
union
select 'sharon'
union
select 'jason'

select * from @tmpTbl
4

2 に答える 2

5

簡単な答えは、(おそらく) 「ストレージ エンジンが行を順序付けられていないヒープに格納しているため、ORDER BY を指定しない場合に行がどのように出力されるかに影響するためです。」

SELECT クエリで ORDER BY を指定しない限り、SQL 仕様に従って、並べ替え順序はundefinedです。これは、MySql、Oracle、SQL Server など、すべての SQL データベースで行われている方法です。データが期待どおりの順序でテーブルから出てくる場合、それは偶然であるか、オプティマイザーがたまたまクエリを生成した方法、またはストレージ エンジンが行を物理的に格納する方法を選択した方法の副作用である可能性が高いです (おそらくこの場合の根本原因)。

必要な並べ替え順序でクラスター化インデックスをテーブルに追加すると、常にではありませんが、多くの場合、テーブルは期待どおりの順序で表示されます。 この動作に依存しないでください。

于 2013-01-23T15:51:45.213 に答える
3

挿入順序で並べ替える場合は、テーブルに自動インクリメント フィールドを追加します。データを選択するときに、それを ORDER BY に含めることができます。

それ以外の場合、SQL Server は特定の順序でデータを返しません。現在は「並べ替えられた」状態で返されているように見えるかもしれませんが、将来はそうでなくなる可能性があります。

ところで、ユニオン クエリ自体は実際には、ステートメントに表示される順序とは異なる順序で結果を返しています。これは、UNION と UNION ALL を使用した結果である可能性があります。ユニオンは異なるため、ある種の型を暗示している可能性があります。したがって、実際に得られる結果は挿入順序です。

于 2013-01-23T15:56:33.220 に答える