2015-10-22 4 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 isnt bad, но разве вы не используете '(@orgid null ИЛИ organizationid = @orgid)' для второго? – JamieD77

+0

@ JamieD77 Это выглядит проще и аккуратно. Спасибо – lad2025

+1

@ lad2025 - пошел с первым решением, и он отлично поработал. Спасибо! – scribbles

Смежные вопросы