Как заставить оператор select возвращать, если есть значение и если его нет - PullRequest
0 голосов
/ 06 ноября 2018

Вот мой код хранимой процедуры SQL Server:

SELECT NOTES as DeletionNote 
FROM STCRCHF_LOG 
WHERE STHTR_ =  @transferNo

IF ( @@ROWCOUNT = 0) 

Если найдены данные, я просто хочу вернуть строку NOTES. Иначе, если у него нет данных, я просто хочу вернуть пустую строку или ноль.

Снимок экрана (выполненная хранимая процедура):

Если найдены данные. В моей программе на стороне веб-сервера он получает данные.

If there is a data

Если данных нет. В моей программе на стороне веб-сервера это вызывает NullReferenceException

if there is no data

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Проверка Если (DataTable.Rows.Count> 0), проверьте на своем уровне веб-программирования, чтобы избежать исключения NullReferenceException. Исходя из условия, вы можете принять решение, что делать с дальнейшей логикой в ​​веб-программе.

Всегда разумно обрабатывать такие исключения на уровне программирования. Подумайте о сценарии, когда кто-то еще вносит изменения в SQL-запрос, не зная влияния использования кода в сети.

0 голосов
/ 06 ноября 2018

Другой способ, который мне нравится, это использовать фиктивное значение и OUTER APPLY, как это.

-- sample data
DECLARE @table TABLE (someId INT IDENTITY, Col1 VARCHAR(100));
INSERT @table(Col1) VALUES ('record 1'),('record 2');

DECLARE @id INT = 11;

SELECT f.Col1
FROM   (VALUES(NULL)) AS dummy(x)
OUTER APPLY 
(
  SELECT t.Col1
  FROM   @table AS t
  WHERE t.someId = @id
) AS f;
0 голосов
/ 06 ноября 2018

Если возможна только одна запись, то:

select coalesce((SELECT NOTES FROM STCRCHF_LOG 
WHERE STHTR_ =  @transferNo), '') as DeletionNote

Если возможно несколько записей, следующее гарантирует, что будет возвращена хотя бы одна строка:

SELECT NOTES as DeletionNote FROM STCRCHF_LOG WHERE STHTR_ =  @transferNo
union all select '' /* or null if preferred */ where not exists (SELECT 1 FROM STCRCHF_LOG WHERE STHTR_ =  @transferNo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...