2015-10-22 49 views
2

我有一系列用于QA的查询。通常我们将organizationid限制为单个值,但偶尔我们想要返回所有organizationid的值。是否可以做到这一点,而不必在查询中注释掉所有的@orgid是否可以设置局部变量来允许任何值?

例子:

DECLARE @REPSD DATETIME = '10-01-2014'; 
DECLARE @REPED DATETIME = '09-30-2015'; 
DECLARE @orgid BIGINT = 5 

SELECT 
    patientid, 
    MAX (dateofobservation) sbp_date INTO #t1 
FROM 
    dbo.patientobservation (nolock) 
WHERE observationcode IN ('8479-8','8480-6','8459-0','8460-8','8461-6') 
    AND dateofobservation >= @REPSD 
    AND dateofobservation <= @REPED 
    AND organizationid = @orgid 
+0

你真的不应该使用NOLOCK,除非你真的明白这个提示。如果你打算使用它,你应该使用正确的语法。不建议使用索引提示的WITH关键字,并将在将来删除。这里有一篇很棒的文章,讨论那个提示的弊端。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

回答

4

也许你想:

DECLARE @REPSD DATETIME = '10-01-2014'; 
DECLARE @REPED DATETIME = '09-30-2015'; 
DECLARE @orgid BIGINT = NULL 

SELECT 
    patientid, 
    MAX (dateofobservation) sbp_date INTO #t1 
FROM 
    dbo.patientobservation (nolock) 
WHERE observationcode IN ('8479-8','8480-6','8459-0','8460-8','8461-6') 
    AND dateofobservation >= @REPSD 
    AND dateofobservation <= @REPED 
    AND organizationid = ISNULL(@orgid,organizationid); 

或:

SELECT 
    patientid, 
    MAX (dateofobservation) sbp_date INTO #t1 
FROM 
    dbo.patientobservation (nolock) 
WHERE observationcode IN ('8479-8','8480-6','8459-0','8460-8','8461-6') 
    AND dateofobservation >= @REPSD 
    AND dateofobservation <= @REPED 
    AND 
    (
     (organizationid = @orgid AND @orgid IS NOT NULL) 
     OR @orgid IS NULL 
    ) 

使用JamieD77建议这相当于以上,但更简单,更紧凑:

AND (@orgid IS NULL OR organizationid = @orgid) 

您应该考虑使用第三个示例,因为第一个示例不是SARGable,所以如果存在任何查询优化器,则不会在该列上使用索引。

+2

isnull不是不好,但你不会使用'(@orgid为null或organizationid = @orgid)'为第二? – JamieD77

+0

@ JamieD77看起来更简单和整洁。谢谢 – lad2025

+1

@ lad2025 - 采用第一种解决方案,效果很好。谢谢! – scribbles

相关问题