如果WWHERE子句的条件可能不同,是否有任何替代方法来创建存储过程而不将所有查询放在一个长字符串中.
假设我有Orders表我想在这个表上创建存储过程,并且有三列我可以过滤记录.
1- CustomerId,2- SupplierId,3- ProductId.
如果用户仅在搜索条件中提供CustomerId,则查询应如下所示
SELECT * FROM Orders WHERE Orders.CustomerId = @customerId
如果用户仅在搜索条件中提供ProductId,则查询应如下所示
SELECT * FROM Orders WHERE Orders.ProductId = @productId
如果用户只给出了所有三个CustomerId,ProductId和SupplierId,那么将在WHERE中使用所有三个ID进行过滤.
用户也有可能不希望过滤记录,那么查询应该如下所示
SELCT * FROM Orders
每当我必须创建这种过程时,我将所有这些都放在字符串中并使用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)
谢谢.
您可以传递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 )
不要使用SELECT *,始终列出您实际需要的列.