文字列をいくつかの区切り文字で分割し、これらの値をテーブルに返す小さなsql関数を使用します。ORDER BY(SELECT NULL)
ALTER FUNCTION [shark].[SplitStrings]
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
RETURN (SELECT [Item], ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [Id] FROM
(SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
FROM (SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
WHERE Item IS NOT NULL
);
これは、要素の順序を文字列から変更できるかどうかです。
Ex。
SELECT * FROM [shark].[SplitStrings] ('1,2,3,4,5', ',')
この戻り
1
5
3
4
2
代わりの
1
2
3
4
5
できますか?
詳細情報 数か月の正常な作業の後、私たちのコンポーネントの1つにバグがあり、このバグの原因となる可能性のある唯一のソースが記載されています。それは何とか65000要素を含む文字列配列の順序を変更しました(区切り文字を含む文字列の全長は65000 * 11でした)。私たちは、同じSQLサーバ上で同じエラーを再現しようとしましたが、運がありませんでした。あなたのコメントと答えは、このsprocをより有罪にしました。
'ORDER BY'節があるのは、' ROW_NUMBER() 'の値が行にどのように割り当てられるかを定義することだけです。しかし、すべての行にその句内の同じ値が与えられているので、割り当てられた行番号は決して保証されません。そして、結果が返される順序に影響を与える保証はありません*。 –
私は@Damien_The_Unbelieverに同意します。論理的な順序の欠如は、何らかの順序をもたらす可能性があります。私は、SQL Serverのアップグレード後に、必要な順序で何年もデータを返してきたクエリーを持っていましたが、別の順序でそれを提供し始めました。正確な行番号付けを提供するために類似のループである関数を作成しました。効率的ではありませんが、正確です。 – UnhandledExcepSean
XQuery *は要素を順番に処理しますので、これをより堅牢にしたい場合は、そこにカウンタを実装します(XQueryにはネイティブノードカウント機能もありますが、SQL Serverではそれらを実装していません)。 XMLノードには順序があります。 'ROW_NUMBER()'はそうではありません。実際には、オプティマイザが順調に進んでいないことを観察できるかどうかはわかりません。可能であれば、大規模なセットの場合、並列プランが選択されても文字列が小さすぎるとそれ。 –