在不同的搜索条件上创建具有不同WHERE子句的存储过程,而不将所有内容放入长字符串

Kas*_*hif 4 sql t-sql

如果WWHERE子句的条件可能不同,是否有任何替代方法来创建存储过程而不将所有查询放在一个长字符串中.

假设我有Orders表我想在这个表上创建存储过程,并且有三列我可以过滤记录.

1- CustomerId,2- SupplierId,3- ProductId.

如果用户仅在搜索条件中提供CustomerId,则查询应如下所示

SELECT * FROM Orders WHERE Orders.CustomerId = @customerId
Run Code Online (Sandbox Code Playgroud)

如果用户仅在搜索条件中提供ProductId,则查询应如下所示

SELECT * FROM Orders WHERE Orders.ProductId = @productId
Run Code Online (Sandbox Code Playgroud)

如果用户只给出了所有三个CustomerId,ProductId和SupplierId,那么将在WHERE中使用所有三个ID进行过滤.

用户也有可能不希望过滤记录,那么查询应该如下所示

SELCT * FROM Orders
Run Code Online (Sandbox Code Playgroud)

每当我必须创建这种过程时,我将所有这些都放在字符串中并使用IF条件来检查参数(@customeId或@supplierId等)是否具有值.

我使用以下方法来创建过程

DECLARE @query      VARCHAR(MAX)
DECLARE @queryWhere VARCHAR(MAX)

SET @query = @query + 'SELECT * FROM Orders '

IF (@originationNumber IS NOT NULL)
BEGIN
    BEGIN
        SET @queryWhere =@queryWhere + ' Orders.CustomerId = ' + CONVERT(VARCHAR(100),@customerId)
    END
END

IF(@queryWhere <> '')
BEGIN
   SET @query = @query+' WHERE ' + @queryWhere
END

EXEC (@query)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Pet*_*ang 6

您可以传递NULL不希望包含在WHERE-clause中的字段,并NULL在查询中检查:

Select customerId, productId, supplierId
From Orders
Where ( customerId = @customerId Or @customerId IS NULL )
  And ( productId = @productId Or @productId IS NULL )
  And ( supplierId= @supplierId Or @supplierId IS NULL )
Run Code Online (Sandbox Code Playgroud)

不要使用SELECT *,始终列出您实际需要的列.