5

SSRS 2005 には、次のようなクエリに基づくレポートがあります。

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'

ユーザーがチェックボックスをオンにしたかどうかに基づいて、クエリに WHERE 句の AND 部分を動的に含めることができるようにする必要があります。基本的に、これは動的 SQL ステートメントであり、それが問題です。私は無駄にいくつかのアプローチを試みました。これは可能ですか?SSRS 2005 は動的 SQL をサポートしていますか? ありがとう!

4

8 に答える 8

15

チャールズはほとんど正解でした。

そのはず:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
   AND (@checked = 0 OR col2 LIKE '%XYZ%')

これは、条件付き述語のSQLにおける古典的な「パターン」です。の場合@checked = 0、述語(col1 = 'ABC')の残りの部分に一致するすべての行を返します。SQL Serverは、の後半も処理しませんOR

その場合@checked = 1、の2番目の部分を評価し、OR一致する行を返します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を使用しないでください。

于 2008-09-26T07:46:50.383 に答える
3

これはどう。@checked はビット変数です。

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')

編集: また、ストアド プロシージャを使用していない場合は、ストアド プロシージャを使用してください。

于 2008-09-26T05:35:00.997 に答える
1

これを行う1つの方法は、SSRSクエリを式として生成することです。BIDSレポートデザイナで、クエリを次のように設定します。

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
于 2008-09-26T07:38:20.043 に答える
1

これは SSRS 2000 でも機能しますが、最後の手段として使用されます。

(悪い) 疑似コード

="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")

「動的」SQL クエリの実行を確認してください。SQL Server 2000 Reporting Services へのヒッチハイク ガイドから

于 2008-09-26T06:12:55.943 に答える
1

おそらくこれはあなたのために働くでしょう:

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 ステートメントを使用することもできます。

于 2008-09-26T05:00:54.900 に答える
1
SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
于 2008-09-26T05:56:52.143 に答える
0

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

于 2008-09-26T05:29:59.370 に答える
0

ストアド プロシージャを使用できる場合は、おそらくそこで実行する方が簡単です。パラメータを渡します。条件に基づいて SQL 文字列を作成し、SQL 文字列に対して EXEC を実行すると、ストアド プロシージャが必要な結果を返します。

于 2008-09-26T16:35:40.617 に答える