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

标签 sql tsql

如果 WWHERE 子句的条件可能不同,是否有其他方法可以创建存储过程,而无需将所有查询放入一个长字符串中。

假设我有 Orders 表,我想在该表上创建存储过程,并且我想在三列上过滤记录。

1- 客户 ID、2- 供应商 ID、3- 产品 ID。

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

SELECT * FROM Orders WHERE Orders.CustomerId = @customerId

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

SELECT * FROM Orders WHERE Orders.ProductId = @productId

如果用户仅给出所有三个 CustomerId、ProductId 和 SupplyId,则所有三个 Id 将在 WHERE 中使用进行过滤。

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

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)

谢谢。

最佳答案

您可以为不想包含在 WHERE 子句中的字段传递 NULL 并在查询中检查 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 *,始终列出您实际需要的列。

关于sql - 创建在不同搜索条件上具有不同 WHERE 子句的存储过程,而不将所有内容放入长字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2522886/

相关文章:

Mysql 将两行合并为一列

sql-server - 重命名索引的最佳方法

mySQL查询,有什么问题吗?

sql - 将秒转换为小时和分钟

sql - 在 t-sql 中对大数执行取模

sql-server - 按连接表上的性能问题排序

mysql - 链接服务器和访问权限

c# - 从 SQLITE PCL 获取特定月份的计数

Mysql在一个查询中多次使用存储过程结果

sql - 从自定义电子邮件表发送电子邮件的代理作业