2014-09-25 56 views
1

我正在使用存儲過程在我的數據庫中搜索並篩選參數上的結果,我需要篩選未知的多個參數。在SQL Server中處理多個參數

我該如何編寫一個處理這個問題的存儲過程?

這裏是我的存儲過程:

CREATE PROCEDURE ComplaintRefListOnDistrict 
    @District nvarchar(max) = '' 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     ComplaintFullID, CustomerName, Customer_Address, CustomerEmail, 
     Date, ContractID, CustomerPhoneNumber,ID, Complaintreference_ID, State 
    FROM 
     dbo.ComplaintsSmartObject 
    LEFT JOIN 
     dbo.UsersDistricts ON dbo.UsersDistricts.District = dbo.ComplaintsSmartObject.District 
    WHERE 
     (dbo.UsersDistricts.District = @District) 
END 
GO 

謝謝!

+1

你的意思是,如果@District包含「dist1,dist2」,以及如何獲得基於此結果? – 2014-09-25 10:05:49

+0

通過存儲過程中的參數,我們指輸入/輸出參數。就像你的情況一樣'@District'是輸入參數。當你說多個參數時,我相信你是指@District中的多個和未知值。如果這是正確的,那麼請分享您希望傳遞給此sproc的字符串。 – Deepshikha 2014-09-25 10:30:44

+0

是啊! – 2014-09-25 10:30:47

回答

0

我說的是使用這種動態SQL。

CREATE PROCEDURE ComplaintRefListOnDistrict 
     @District nvarchar(max) = '' 
    AS 
    BEGIN 
     SET NOCOUNT ON; 

    declare @sql nvarchar(max) 

    set @sql = 'SELECT 
      ComplaintFullID, CustomerName, Customer_Address, CustomerEmail, 
      Date, ContractID, CustomerPhoneNumber,ID, Complaintreference_ID, State 
     FROM 
      dbo.ComplaintsSmartObject 
     LEFT JOIN 
      dbo.UsersDistricts ON dbo.UsersDistricts.District = dbo.ComplaintsSmartObject.District 
     WHERE 
      (dbo.UsersDistricts.District in (' + @District + '))' 

    EXEC sp_executesql @sql 
    END 
+0

在這裏,您不必創建一個util函數來以表格方式拆分和獲取值。 – 2014-09-26 03:05:28

+0

爲了達到此目的,您需要通過@District作爲逗號分隔的引用值,如果區域是「dist1」,「dist2」,則需要調用此sp作爲 EXEC ComplaintRefListOnDistrict'''dist1'',''dist2 ''' 如果這是整數值,則不必輸入單引號。 – 2014-09-28 09:01:59

0
CREATE PROCEDURE ComplaintRefListOnDistrict 
(
@District nvarchar(max) = NULL 
) 
AS 
BEGIN 

SET NOCOUNT ON; 
SELECT 
CSC.ComplaintFullID, CSC.CustomerName, CSC.Customer_Address, CSC.CustomerEmail, 
CSC.Date, UD.ContractID, UD.CustomerPhoneNumber,UD.ID, UD.Complaintreference_ID, UD.State 
FROM 
    dbo.ComplaintsSmartObject CSC 
    LEFT JOIN dbo.UsersDistricts UD 
    ON UD.District = CSC.District 
WHERE 
(
      UD.District LIKE '%' + @District + '%' 
      OR @District IS NULL 
      OR @District = '' 
      ) 

    ORDER BY CSC.ComplaintFullID, 
    CSC.CustomerName, 
    CSC.Customer_Address, 
    CSC.CustomerEmail, 
CSC.Date, UD.ContractID, UD.CustomerPhoneNumber,UD.ID, UD.Complaintreference_ID, UD.State 


END 
GO 
+0

也許我沒有解釋得很好,我的存儲過程收到一個參數,我需要一個存儲過程,接收未知數的參數, 要清楚我有一個下拉列表有不穩定的項目,我怎麼能讓我的存儲過程拿他們沒有指定它有多少參數?無論他們有多少人,我都想一次過把他們傳給他們,這有可能嗎? 注意到此過程只收到一個項目。 希望其明確 – 2014-09-25 10:27:14

+0

你聲明只有一個參數,並在選擇聲明你要求搜索所需的數據。所以我給了搜索條件 – mohan111 2014-09-25 10:29:56

0

您可以創建在您使用的參數不明WHERE子句或檢查它是否是空

WHERE (dbo.UsersDistricts.District = @District OR District IS NULL) 
AND (SomeOtherColumn = @OtherParameter OR OtherParameter IS NULL) 

等。

1

首先添加一個輔助函數,該函數會將傳遞給它的字符串拆分成行。

CREATE FUNCTION SplitString 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS 
    @output TABLE(Data NVARCHAR(MAX)) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 
    BEGIN 
     IF (@end = 0) SET @end = LEN(@string) + 1 
     INSERT INTO @output (Data) VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 
    END 
    RETURN 
END 

現在一切都非常簡單。使用SQL IN運營商:

CREATE PROCEDURE ComplaintRefListOnDistrict 
    @District nvarchar(max) = '' 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     ComplaintFullID, CustomerName, Customer_Address, CustomerEmail, 
     Date, ContractID, CustomerPhoneNumber,ID, Complaintreference_ID, State 
    FROM 
     dbo.ComplaintsSmartObject 
    LEFT JOIN 
     dbo.UsersDistricts ON dbo.UsersDistricts.District = dbo.ComplaintsSmartObject.District 
    WHERE 
     (dbo.UsersDistricts.District IN (SELECT Data FROM dbo.SplitString(@District, ','))) 
END 

HTH。

+1

你是真棒男人,我希望我有足夠的聲望點投票,謝謝你!我非常感謝:) – 2014-09-25 10:47:39

+0

@MostafaAb,很高興知道它的幫助。 :)如果它已完全解答您的問題,您可以將其標記爲答案,以便對搜索相同問題的其他人員有所幫助。 – 2014-09-25 12:44:56