Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中处理多个参数_Sql_Sql Server_Stored Procedures - Fatal编程技术网

在SQL Server中处理多个参数

在SQL Server中处理多个参数,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我使用一个存储过程在数据库中搜索并过滤一个参数的结果,我需要过滤未知的多个参数 我如何编写一个存储过程来处理这个问题 以下是我的存储过程: CREATE PROCEDURE ComplaintRefListOnDistrict @District nvarchar(max) = '' AS BEGIN SET NOCOUNT ON; SELECT ComplaintFullID, CustomerName, Customer_Address, Cus

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

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

以下是我的存储过程:

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

谢谢大家!

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

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
WHERE (dbo.UsersDistricts.District = @District OR District IS NULL)
AND (SomeOtherColumn = @OtherParameter OR OtherParameter IS NULL)

依此类推。

首先添加一个helper函数,该函数将传递给它的字符串拆分为行

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

  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

你们的意思是,若@District包含“dist1,dist2”,那个么该怎么办?根据存储过程中的参数,我们指的是输入/输出参数。与您的情况类似,
@District
是输入参数。当你说多个参数时,我相信你是指@District中的多个未知值。如果这是正确的,那么请共享您希望传递给此存储过程的字符串。正如@ArindamNayak所说,如果我的输入参数“@District”有一个以上的值,该怎么办?@MostafaAb,我将发布此特定内容的解决方案-多个值,您需要使用动态SQL来实现此目的。@MostafaAb,很抱歉迟才回复帖子,但是你可以检查我的答案,它非常简单,不需要创建第二个函数来获取分割值。也许我没有解释清楚,我的存储过程接收一个参数,我需要一个接收未知数量参数的存储过程,很明显,我有一个下拉列表,其中有不稳定的项,在不指定存储过程中有多少参数的情况下,如何让存储过程接受它们?我想一次通过,不管他们有多少,有可能吗?请注意,此过程只接收一个项目。希望很清楚,你只声明了一个参数,在select语句中,你要求搜索所需的数据。因此,我在where CONdition中进行了搜索。你是个了不起的人,我希望我有足够的声誉点数来投票,谢谢!我非常感激:)@MostafaAb,很高兴知道这有帮助如果它完全回答了您的问题,您可以将其标记为答案,以便对其他来搜索同一问题的人有所帮助。在这里,您不必创建util函数来拆分并以表格方式获取值。要使其起作用,您需要以逗号分隔的方式将@District作为引用值传递,如果dist1和dist2是,您需要以EXEC ComplaintRefListOnDistrict“'dist1”和“dist2”的形式调用此sp,如果这是整数值,则不必使用单引号。
  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