【问题标题】:Handle multiple parameters in SQL Server在 SQL Server 中处理多个参数
【发布时间】:2014-09-25 10:00:07
【问题描述】:

我正在使用存储过程在我的数据库中搜索并过滤参数的结果,我需要过滤未知的多个参数。

如何编写一个存储过程来处理这个问题?

这是我的存储过程:

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

谢谢!

【问题讨论】:

  • 你的意思是,如果@District 包含“dist1,dist2”怎么办,如何根据它得到结果?
  • 存储过程中的参数是指输入/输出参数。就像你的情况一样 @District 是输入参数。当您说多个参数时,我相信您的意思是 @District 中的多个未知值。如果这是正确的,那么请分享您希望传递给这个存储过程的字符串。
  • 正如@ArindamNayak 所说,如果我的输入参数“@District”不止一个值怎么办?
  • @MostafaAb ,我将为这个特定的事情发布解决方案 - 不止一个值,您需要使用动态 SQL 来实现这一点。
  • @MostafaAb ,很抱歉回复晚了,但是您可以查看我的答案,这很简单,无需创建第二个函数来获取拆分值。

标签: sql sql-server stored-procedures


【解决方案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。

【讨论】:

  • 你是个了不起的人,我希望我有足够的声望点来投票,谢谢!我非常感谢:)
  • @MostafaAb,很高兴知道它有帮助。 :) 如果它完全回答了您的问题,您可以将其标记为答案,以便对其他寻找相同问题的人有所帮助。
【解决方案2】:

我说要使用这种动态 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

【讨论】:

  • 这里你不必创建一个util函数来以表格的方式拆分和获取值。
  • 为此,您需要将@District 作为引用值传递,并用逗号分隔,如果地区是“dist1”、“dist2”,则需要将此 sp 作为 EXEC ComplaintRefListOnDistrict '''dist1 调用'',''dist2''' 如果是整数值,就不用单引号了。
【解决方案3】:
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

【讨论】:

  • 可能我没有解释清楚,我的存储过程接收一个参数,我需要一个接收未知数量参数的存储过程,要清楚我有一个下拉列表有不稳定的项目,怎么能我让我的存储过程使用它们而不指定其中有多少参数?不管多少个我都想一口气通过,可以吗?请注意,此过程仅接收一项。希望它清楚
  • 您只声明了一个参数,并且在 select 语句中您要求搜索所需的数据。所以我在 where 条件下进行了搜索
【解决方案4】:

您可以创建一个 WHERE 子句,在其中使用 unknow 参数或检查它是否为空

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

等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2021-10-25
    • 2010-11-30
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多