Отличить пустой от результатов NULL-запроса - PullRequest
2 голосов
/ 10 апреля 2009

У меня есть таблица с данными измерений в SQL Server 2005, одно значение на человека и год, если доступно. Мой код TSQL извлекает эти значения в цикле и обрабатывает их:

...
SET @val = (SELECT measurement FROM tbl_data WHERE persid = @curpersid AND yr = @curyear)
...

Теперь для определенного человека и года таблица может содержать (i) правильное измерение, (ii) значение NULL или (iii) вообще никакой соответствующей строки.

Как эффективно дифференцировать эти случаи? И (ii), и (iii) приведут к тому, что @val будет иметь значение NULL, поэтому с текущим кодом их невозможно дифференцировать ...

Спасибо большое за любые подсказки, wwwald

Ответы [ 4 ]

2 голосов
/ 10 апреля 2009

Если вы можете использовать значение, которое измерение никогда не сможет принять, можно использовать COALESCE ().

SET @val = (SELECT COALESCE(measurement, someValueThatDoesNotOccur) FROM tbl_data WHERE persid = @curpersid AND yr = @curyear)

Нет строки: @val == null

измерение было NULL: @val равно somevalue

еще vlaid измерение

1 голос
/ 10 апреля 2009

Я спрашиваю, почему вы вообще зацикливаетесь? Циклы в SQL Server - плохая вещь, так как они снижают производительность. У большинства вещей есть лучшее решение на основе множеств. Возможно, у вашей проблемы есть лучшее решение, если вы сообщите нам, что вы делаете в цикле, помимо установки значения переменной.

1 голос
/ 10 апреля 2009

Возможно проверить @@ROWCOUNT? Однако это немного рискованно, так как вы должны быть уверены, что не выполняете никаких других операций перед проверкой @@ROWCOUNT (обновляется после большинства операций).

Либо прочитайте другой столбец, например первичный ключ:

SELECT @val = measurement, @id = id
FROM tbl_data WHERE persid = @curpersid AND yr = @curyear

Теперь проверьте @id - если это NULL, строки не было.

0 голосов
/ 10 апреля 2009

Ну, это немного взломано, но:

SET @val = -99999  -- or some other value that will never occur in the table
SELECT @val = measurement FROM tbl_data WHERE persid = @curpersid AND yr = @curyear

Теперь, если @val по-прежнему равен -9999, тогда строки не было или ноль, если измерение было нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...