Sql server SQL Server条件选择取决于输入参数

Sql server SQL Server条件选择取决于输入参数,sql-server,Sql Server,我在MS SQL中有一个存储过程,它接受2个参数,例如 CREATE PROCEDURE MyProcedure @A INT, @B INT AS BEGIN SELECT ... FROM ... WHERE [A] = @A AND [B] = @B END 我的问题是。如果我有@B=0,我希望在选择行中像这样[A]=@A,而不是[B]=@B。。如何用最少的代码实现这一点?非常感谢请尝试以下操作: SELEC

我在MS SQL中有一个存储过程,它接受2个参数,例如

CREATE PROCEDURE MyProcedure
    @A      INT,
    @B      INT
AS
BEGIN
    SELECT  ...

    FROM    ...

    WHERE   [A] = @A AND [B] = @B 

END
我的问题是。如果我有@B=0,我希望在选择行中像这样[A]=@A,而不是[B]=@B。。如何用最少的代码实现这一点?非常感谢

请尝试以下操作:

SELECT  ...    
FROM    ...    
WHERE   [A] = @A AND 
        (@B = 0 OR [B] = @B)

这是一个丑陋的解决方案,但很简单:

If @B = 0 begin
   ...your sql query without the B = @B
end
else if @B <> 0 begin
   ... your sql query with the B = @B
end
如果@B=0开始
…不带B=@B的sql查询
结束
否则如果@b0开始
... 使用B=@B的sql查询
结束

您可能想尝试以下方法:

CREATE PROCEDURE MyProcedure
    @A      INT,
    @B      INT
AS
BEGIN
    DECLARE @sql varchar(max)
    DECLARE @whereStat varchar(max)
    IF @B = 0 
       SET @whereStat = 'WHERE [A] = ' + @A
    ELSE
       SET @whereStat = 'WHERE [A] = ' + @A + 'AND [B] = '+ @B 

    SET @sql = 'SELECT  ...

    FROM    ... '+ @whereStat
    exec sp_execsql @sql

END

基本上,您可以动态创建一个sql字符串,并通过系统存储过程执行它。这可能不是最好的方法/最快的方法,但它是另一种选择。:)

我认为只有这一点才能完全回答最初的问题。这样,您就可以真正排除where子句中不需要的参数。
CREATE PROCEDURE MyProcedure
    @A      INT,
    @B      INT
AS
BEGIN
    DECLARE @sql varchar(max)
    DECLARE @whereStat varchar(max)
    IF @B = 0 
       SET @whereStat = 'WHERE [A] = ' + @A
    ELSE
       SET @whereStat = 'WHERE [A] = ' + @A + 'AND [B] = '+ @B 

    SET @sql = 'SELECT  ...

    FROM    ... '+ @whereStat
    exec sp_execsql @sql

END