質問

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つのアポストロフィ 'を使用していることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top