0
declare @SP nvarchar(3)

SELECT HDR.SOPNUMBE, HDR.docdate, HDR.pymtrmid, 
RTRIM(HDR.ShipToName) +
CASE WHEN HDR.ADDRESS1 <> '' THEN char(10) + RTRIM(HDR.ADDRESS1) ELSE '' END 
FROM vSOPHdr HDR
WHERE HDR.SOPTYPE = 2 AND 
(CASE WHEN HDR.SLPRSNID <> 'All' 
then HDR.SLPRSNID in (''+@SP+'') 
else HDR.SLPRSNID between '0' and 'ZZZZZZZZZZZZZZZ'  
end)

上記のクエリを SQL クエリ アナライザで実行しようとしていますが、CASE 式 (IN、ELSE の近く) で「構文」エラーが発生します。何が間違っている可能性がありますか?

私がやりたいのは、レポート パラメーターで sales-personID が ALL として選択されている場合に、選択した営業担当者 ID のみをすべての営業担当者として処理したいということだけです。

私がやっていることについての単なる背景、

SSRS レポートのデータセット内に、上記のクエリ (CASE 条件なし) と同様のクエリがあります。

@SP はレポート パラメータであることに注意してください。

4

2 に答える 2

4

CASE単一の値を返す式です。VB などの他の言語のように、フロー制御ロジックには使用できません。試す:

WHERE HDR.SOPTYPE = 2 AND 
((HDR.SLPRSNID <> 'All' AND HDR.SLPRSNID = @SP)
OR
(HDR.SLPRSNID = 'All'))

代わりに必要なように思えますが、ユーザーが'All'パラメーターに渡す可能性がある場合は、より論理的に意味があります。

WHERE HDR.SOPTYPE = 2 AND 
((@SP <> 'All' AND HDR.SLPRSNID = @SP)
OR
(@SP = 'All'))
于 2014-01-30T22:19:41.090 に答える
2

OR句を使用するだけです

WHERE HDR.SOPTYPE = 2 AND 
((HDR.SLPRSNID <> 'All' AND HDR.SLPRSNID IN (''+@SP+'')) 
OR 
(HDR.SLPRSNID = 'All' AND HDR.SLPRSNID BETWEEN '0' and 'ZZZZZZZZZZ'))

BETWEEN '0' and 'ZZZZZZZZZZZ'「INすべて」を意味するかどうかはわかりません。はいの場合は、今すぐ削除できます。

絶対に CASE WHEN を使用したい場合は、次の方法で実行できます。

WHERE HDR.SOPTYPE =2 
AND (CASE WHEN HDR.SLPRSNID <>'All' AND HRD.SLPRSNDID IN (''+@SP+'')) THEN 1
          WHEN HDR.SLPRSNID = 'All' AND HDR.SLPRSNID BETWEEN '0' and 'ZZZZZZZZZZ' THEN 1
          ELSE 0 
     END) = 1
于 2014-01-30T22:20:55.297 に答える