2013-07-18 50 views
0

對不起,我的標題非常清晰。我試圖創建一個存儲過程:將變量設置爲某個值或默認設置爲列中的所有值

Create Procedure Pro1 @a nvarchar = null, @b nvarchar =null 
as 
Select * from table1 
where Parameter1 = '1' 
and Parameter2 = @a 
go 

上面不是實際的代碼,但我希望它解釋了我想實現的。我選擇了兩個參數。 '參數2'取決於變量@a。我面臨的挑戰是,如果@a在執行時保持爲空;我希望select語句在Parmeter2的所有值上搜索,就好像'和'語句不在那裏一樣。我可以編寫一個if else語句來執行不同的選擇,但是我希望我可以簡單地將@a設置爲通配符值的某種 ,這只是簡單地做到這一點?也許有些事情:'像[]'?

+2

簡單的答案:AND(Parameter2 = @a OR @a IS NULL)'。如果這太複雜了,可以使用動態SQL來發現更好的性能,只用相關的子句構建語句。 –

+2

此外,[停止聲明變長數據類型無長](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length的.aspx)。抱歉大叫,但我不明白爲什麼這麼多人這麼懶。 –

+0

其實在代碼中我已經包含了長度,我只是忘了在這個例子中包含它們。 – Arantuath

回答

2
CREATE PROCEDURE dbo.Pro1 -- use schema prefix when creating objects! 
    @a NVARCHAR(32) = NULL -- 32 should match data type of Parameter2 column 
AS 
BEGIN -- wrap your body and indent for readability 
    SET NOCOUNT ON; -- should always turn off DONE_IN_PROC messages 

    SELECT columns -- please name your columns instead of SELECT * 
    FROM dbo.table1 -- use schema prefix when referencing objects 
    WHERE (Parameter2 = @a OR @a IS NULL); -- semi-colons please! 
END 
GO 

在某些情況下,你可能會發現,如果你有很多這些可選參數,SQL Server將編譯一個計劃,一組參數,該計劃不會對不同的參數是非常有益的。所以你可能想要像這樣:

CREATE PROCEDURE dbo.Pro1 
    @a NVARCHAR(32) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = N'SELECT columns FROM dbo.table1 WHERE 1=1'; 

    IF @a IS NOT NULL 
    SET @sql += ' AND Parameter2 = @a'; 

    EXEC sp_executesql @sql, 
    N'@a NVARCHAR(32)', 
    @a; 
END 
GO