2014-09-25 54 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