在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