【问题标题】:Stored Procedure WHERE clause存储过程 WHERE 子句
【发布时间】:2014-03-31 02:15:50
【问题描述】:

我的存储过程有一些问题。它要求我以三种不同的方式搜索患者,PatientIDLastNameMedicareNum。出于某种原因,我可以通过MedicareNum 进行搜索,但无法使用其他两个进行搜索。

到目前为止,这是我的代码:

ALTER PROCEDURE SearchByMedi
(
    @MedicareNum nchar (10),
    @LastName varchar(50),
    @PatientID nchar(10)
)
as
Begin
    SELECT * from Patient
    WHERE MedicareNum = @MedicareNum OR @MedicareNum IS NULL
      AND LastName = @LastName OR @LastName IS NULL
      AND PatientID = @PatientID OR @PatientID IS NULL
End

提前感谢您的任何反馈,非常感谢!

编辑:很抱歉花了这么长时间来发布我到目前为止所做的事情。我努力了: 改变程序 SearchByMedi @MedicareNum nchar (10), @LastName varchar(50), @PatientID nchar(10) 作为 开始 设置无计数;

DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT * from Patient WHERE 1 = 1 '
         + CASE WHEN @MedicareNum=''
                THEN N' AND MedicareNum = @MedicareNum'
                ELSE N' ' END
         + CASE WHEN @LastName=''
                THEN N' AND  LastName = @LastName'
                ELSE N' ' END
         + CASE WHEN @PatientID=''
                THEN N' AND PatientID = @PatientID '
                ELSE N'' END

EXECUTE sp_executesql @Sql
                 ,N'@MedicareNum nchar(10), @LastName varchar(50),@PatientID nchar(10)'
                 ,@MedicareNum
                 ,@LastName 
                 ,@PatientID

END

我也试过它说当@MedicareNum =''时,我使用了你的解决方案(IS NOT NULL)并且它不起作用。我也试过: 开始

Select * from Patient
WHERE (@MedicareNum=MedicareNum or @MedicareNum='')
AND (@LastName=LastName or @LastName='')
AND (@PatientID=PatientID or @PatientID='')

End

^此代码返回数据,MedicareNum 的数据正确,但按 LastName 和 PatientID 搜索的数据不正确。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    您需要将 where 子句的不同情况包装在一起。您的 OR 和 AND 一起运行。

    ALTER PROCEDURE SearchByMedi
    (
    @MedicareNum nchar (10),
    @LastName varchar(50),
    @PatientID nchar(10)
    )
    as
    Begin
    
    SELECT * from Patient
    WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
    AND (LastName = @LastName OR @LastName IS NULL)
    AND (PatientID = @PatientID OR @PatientID IS NULL)
    
    End
    

    这样做你会得到 where MedicareNum = var or null 然后 LastName = var or null 您原来的方式是一起检查所有三个值而不是单独检查

    【讨论】:

    • 我使用了这段代码,它没有带回任何数据。我知道这是我的存储过程代码,因为在使用它之前我至少可以搜索 MedicareNum。不过谢谢。
    • 这确实有效!谢谢你。我的没有工作,因为我使用的是数据进入的文本框,而不是用户应该输入数据的文本框。再次谢谢你!我超级兴奋!
    【解决方案2】:

    试试这个:

    ALTER PROCEDURE SearchByMedi
    (
    @MedicareNum nchar (10),
    @LastName varchar(50),
    @PatientID nchar(10)
    )
    as
    Begin
    
    SELECT * from Patient
    WHERE MedicareNum = @MedicareNum OR @MedicareNum IS NULL
    AND (LastName = @LastName OR @LastName IS NULL)
    AND (PatientID = @PatientID OR @PatientID IS NULL )
    
    End
    

    【讨论】:

      【解决方案3】:

      您在复杂条件下遗漏了括号:

      SELECT * from Patient
      WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
      AND (LastName = @LastName OR @LastName IS NULL)
      AND (PatientID = @PatientID OR @PatientID IS NULL)
      

      IMO,最好这样:

      SELECT * from Patient
      WHERE MedicareNum = ISNULL(@MedicareNum, MedicareNum )
      AND LastName = ISNULL(@LastName, LastName )
      AND PatientID = ISNULL(@PatientID, PatientID )
      

      【讨论】:

        【解决方案4】:

        尝试这种方法,它的性能效率更高,然后必须添加其他答案中所示的子句。

        CREATE PROCEDURE SearchByMedi
        @MedicareNum nchar (10),
        @LastName    varchar(50),
        @PatientID   nchar(10)
        AS
        BEGIN
         SET NOCOUNT ON;
        
          DECLARE @Sql NVARCHAR(MAX);
        
          SET @Sql = N'SELECT * from Patient WHERE 1 = 1 '
                     + CASE WHEN @MedicareNum IS NOT NULL
                            THEN N' AND MedicareNum = @MedicareNum'
                            ELSE N' ' END
                     + CASE WHEN @LastName IS NOT NULL
                            THEN N' AND  LastName = @LastName'
                            ELSE N' ' END
                     + CASE WHEN @PatientID IS NOT NULL
                            THEN N' AND PatientID = @PatientID '
                            ELSE N'' END
        
        EXECUTE sp_executesql @Sql
                             ,N'@MedicareNum nchar(10), @LastName varchar(50),@PatientID nchar(10)'
                             ,@MedicareNum
                             ,@LastName 
                             ,@PatientID
        
        END
        

        【讨论】:

        • 它肯定会配合,在你的问题中发布你的尝试,看看你做了什么?您是否也尝试过在 SSMS 中执行该语句并查看它是否返回任何结果??
        猜你喜欢
        • 2011-02-08
        • 2014-01-24
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        相关资源
        最近更新 更多