SSRS:SQLステートメントの動的な変更
-
02-07-2019 - |
質問
SSRS 2005には、次のようなクエリに基づいたレポートがあります:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'
ユーザーがチェックボックスをチェックしたかどうかに基づいて、クエリにWHERE句のAND部分を動的に含めることができる必要があります。基本的に、これは動的SQLステートメントであり、それが問題です。役に立たないいくつかのアプローチを試みました。これは可能ですか? SSRS 2005は動的SQLをサポートしていますか?ありがとう!
解決
チャールズはほぼ正解でした。
次のようになります:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked = 0 OR col2 LIKE '%XYZ%')
これは古典的な「パターン」です条件付き述語のためのSQLで。 @checked = 0
の場合、述語の残りの部分に一致するすべての行を返します( col1 = 'ABC'
)。 SQL Serverは、 OR
の後半も処理しません。
@checked = 1
の場合、 OR
の2番目の部分を評価し、 col1 = 'ABC' AND col2 LIKE '%XYZに一致する行を返します% '
複数の条件付き述語がある場合、このメソッドを使用してそれらを連結できます(IFおよびCASEメソッドはすぐに管理不能になります)。
例:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
AND (@checked2 = 0 OR col3 LIKE '%MNO%')
動的SQLを使用しないでください。IFまたはCASEを使用しないでください。
他のヒント
これはどうですか。 @checkedはビット変数です。
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')
編集:また、ストアドプロシージャを使用していない場合は、ストアドプロシージャを使用します。
おそらくこれはあなたのために働くでしょう:
if @checked = 1
select * from mytable (nolock) where col = 'ABC'
else
select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'
SSRSをあまり使用していないのが残念ですが、@ checkedパラメータにチェックボックスの値を取得できれば、これは動作するはずです。
CASE WHENステートメントを使用することもできます。
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
これはSSRS 2000で機能しますが、最後の手段として使用されます。
(bad)PSEUDOCODE
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")
「動的」を実行; SQLクエリ。 SQL Server 2000 Reporting Servicesのヒッチハイクガイドから
これを行う1つの方法は、SSRSクエリを式として生成することです。 BIDSレポートデザイナーで、次のようにクエリを設定します。
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
ストアドプロシージャを使用できる場合は、おそらくそこで行う方が簡単です。パラメータを渡します。条件に基づいてSQL文字列を作成し、SQL文字列に対してEXECを実行すると、ストアドプロシージャは必要な結果を返します。
別のアプローチを取り、Exec関数を使用することもできます:
DECLARE @CommonSelectText varchar(2000)
DECLARE @CompleteSelectText varchar(2000)
SELECT @CommonSelectText = 'SELECT * FROM MyTable (nolock) Where Col = ''ABC'' '
IF @checked = 1
SELECT @CompleteSelectText = @CommonSelectText + ' AND ColW LIKE ''%XYZ%'' '
ELSE
SELECT @CompleteSelectText = @CommonSelectText
EXEC (@CompleteSelectText)
GO
引用符付きテキストをマークするために2つのアポストロフィ '
を使用していることに注意してください。