4

我在2005年SSRS的報告是基於一個查詢是類似這樣的:SSRS:更改SQL語句動態

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

我需要能夠動態地包括在WHERE子句和部分該查詢基於用戶是否選中了複選框。基本上,這是一個動態的SQL語句,這就是問題所在。我嘗試了幾種方法無濟於事。這可能嗎? SSRS 2005是否支持動態SQL?謝謝!

回答

14

查爾斯幾乎得到了正確的答案。

它應該是:

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的第二部分和返回行匹配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。

+0

對你有好處,更多人需要了解動態SQL有其他選擇。 – HLGEM 2008-09-26 17:23:03

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語句。

+0

在SQL Server中,這可能導致查詢計劃重新編譯,這可能會損害性能。如果您在自己的過程中使用此模式,請考慮拆分,以便擁有主過程,該過程根據參數選擇要調用哪個子過程 - 一個過程一個查詢。 – Meff 2008-10-09 14:24:11

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 

注意使用兩個撇'的標記引用文本。

3

這個怎麼樣。 @checked是你的位變量。

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

編輯:另外,如果你沒有使用一個存儲過程,然後使用一個。

+1

你的答案很好,但是如果我們不能在數據源上執行,並且對數據具有隻讀訪問權限,那麼分級過程方法將不起作用。 – 2008-09-26 23:33:07

+0

在檢查爲假(0)的情況下它不起作用。在這種情況下它不會返回任何匹配,即使有些可能存在。 – 2008-09-26 05:55:51

1
SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC' 
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END 
1

這將工作在SSRS 2000,但作爲最後的手段使用。

(壞)僞

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

退房Executing "Dynamic" SQL Queries。從Hitchhiker指南到SQL Server 2000報告服務

1

執行此操作的一種方法是將SSRS查詢生成爲表達式。在BIDS報告設計器中,設置您的查詢如下:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" + 
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","") 
0

如果你可以使用存儲過程,那麼它可能更容易做到這一點。傳遞你的參數。根據您的條件創建一個SQL字符串,並對sql字符串執行EXEC,您的存儲過程將返回您需要的結果。