SQL Server 2000 带参数的存储过程分支

标签 sql sql-server

我想创建一个存储过程。如果参数为 -1,则该列上不应有 where 子句,否则应有 WHERE 子句。没有大量 IF 分支的最佳方法是什么?

我检查了文件。有几个类似的问题,但不完全相同。

CREATE PROCEDURE report
(
  @site int,
  @promo int,
  @type int
)
AS
SET NOCOUNT ON

-- I want to avoid this:
IF @site = -1 AND @promo = -1 and @type = -1
BEGIN
  SELECT * from table
END
IF @site > -1 AND @promo = -1 and @type = -1
BEGIN
  SELECT * from table WHERE site = @site;
END
... -- other cases


ELSE  -- all parameters are > -1
BEGIN
  SELECT * from table 
  WHERE site = @site AND promo = @promo AND type = @type
END

最佳答案

这在很多情况下都有效(尽管注释会说没有尝试),因为优化器会忽略 ISNULL 位。仅适用于非空列

SELECT @site = NULLIF(@site, -1) ...

SELECT * from table  
  WHERE site = ISNULL(@site, site) ..

否则,条件 WHERE 通常很糟糕,因为 OR 无法优化

SELECT * from table  
  WHERE (@site = -1 OR site = @site) AND  (...

或者单独的存储过程(也不认为您想要那样)

或者使用 sp_executesql(避免动态 SQL)

关于SQL Server 2000 带参数的存储过程分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750883/

相关文章:

sql - 批量插入 Oracle 数据库 : Which is better: FOR Cursor loop or a simple Select?

mysql - 从源数据库插入目标数据库,不同的服务器

c# - Visual Studio 2008 无法连接到 SQL Server 2008

sql-server - 在 Ubuntu 中构建 SQL Server 数据库项目

mysql - 在下面的情况下我们该如何使用Exclusive or呢?

sql - 每笔交易后余额计算

javascript - 使用单个查询更新多个 SQL 记录 使用 npm mysql 进行 MySQL 查询

mysql - SQL 语句 Prestashop

sql-server - 用户定义函数中的错误处理

sql - 如何从 GetDate() 获取时间部分 As hh :mm tt in SQL Server