1

Sql Server 2008 には、試行錯誤のSELECT @VAR = @VAR + FIELD FROM TABLE ORDER BY OTHERFIELD構文を使用してクエリの文字列を変数に連結するコードがあります。

これは私の正確なSQLです:

SELECT @SQL = @SQL + 
    ISNULL(FORMULA, 
    CASE WHEN USEMAP = 1 THEN 
        'dbo.getFieldTranslation('+CONVERT(VARCHAR,ROWID)+', [' + ISNULL(ENCOMPASSFIELD,'') + '])' 
    ELSE 
        '[' + ISNULL(ENCOMPASSFIELD,'') + ']' END
    ) + 
    ' AS "' + FILECOLNAME + '",' + @CRLF  
FROM dbo.EXPORTMAP_EX 
WHERE WAREHOUSEID = @WHSID 
ORDER BY ORDERIDX

これは美しく完璧に機能していました。そしたら今日突然動かなくなりました。最後の行の値を連結するだけでした。ORDER BYデバッグ中に、句を削除すると、すべてのフィールドが戻ってくることがわかりましたが、フィールドの文字列値によって厳密にアルファベット順にソートされています。

ただし、この SQL は、エクスポート用のビューを生成するために使用されています。エクスポート ファイルのフィールドは適切な順序である必要があるため、ORDER BY 句が必要です。ORDER BY が突然結果をフィルタリングするようになったのはなぜですか?

一部のデータに < および > 記号が含まれているため、XML/STUFF ルートを使用できません。
古い W​​HILE ループの使用に戻る必要はありませんが、そうする必要があるかもしれません。

4

1 に答える 1

3

コメントに示されているように、文書化されていない動作に依存しています。

Microsoft は、「集計連結クエリの正しい動作は未定義です。」と言います。計算スカラーが計画の間違った場所に移動すると、機能しなくなります。

サブクエリで順序付け式を定義し、このクエリの結果を連結するという回避策安全だと思います。SQL Serverの注文保証から...

下位互換性の理由から、SQL Server は最上位のスコープで SELECT @p = @p + 1 ... ORDER BY 型の割り当てをサポートしています。

ただし、その投稿は 2005 年に書かれたものなので、保証がまだ有効かどうかはわかりません (編集:この問題に関する Connect Items を確認した後、そうではないと確信しています)

ところで:あなたは言う

一部のデータに < および > 記号が含まれているため、XML/STUFF ルートを使用できません。古い W​​HILE ループの使用に戻る必要はありませんが、そうする必要があるかもしれません。

XML PATHこれは事実ではありませんが、おそらく使用していたよりも少し複雑なクエリが必要です。例については、こちらの回答を参照してください。

于 2012-10-15T20:58:32.287 に答える