2

ユーザー定義のスカラー関数内に次の SQL クエリがあります。

declare @csv varchar(8000)

select  @csv = 
    COALESCE(@csv + ', ' +  CAST(CallID as varchar(10)),
                            CAST(CallID as varchar(10)))
from    calls
where   1=1             --@csv = '6097'
        callid = callid --@csv = '1, 2, 3'...
        callid <= 10000 --always true, expected result (@csv = '1, 2, 3'...)
order by callid

select @csv

1=1 where 条件を使用すると、@csv = '6097' (テーブル内の最大 CallID) が得られます。callid=callid, callid <= 10000 を使用すると、期待どおりの結果が得られます: @csv = '1, 2, 3, '… これは、WHERE または ORDER BY 句を削除した場合の結果でもあります。

なぜこれが起こるのか誰にも考えがありますか?私はそれが起こっている別のケースを持っていますが、機能はもう少し複雑です. ID int not null 主キー フィールドを 1 つ持つまったく新しいテーブルを作成し、1 ~ 6097 を入力して上記のクエリを実行しましたが、「6097」という予期しない結果が返されることはありません。これは、私が SQL Server で経験した中で最も紛らわしい問題です。そのため、誰かが私を指摘する方向性を持っている場合は、大いに感謝します. ありがとう!

4

1 に答える 1

2

callid 列は、最後の行の次の行で NULL に戻ります。これにより、1=1 の場合はアキュムレータがリセットされ、他の場合は callid=callid が失敗します (NULL=NULL が False であるため)。

解決策は、callid の使用を COALESCE 呼び出しでもラップすることです。

于 2013-11-02T23:37:32.363 に答える