3

这是我的 SQL Server 存储过程的代码:

SELECT NOTES as DeletionNote 
FROM STCRCHF_LOG 
WHERE STHTR_ =  @transferNo

IF ( @@ROWCOUNT = 0) 

如果找到数据,我只想返回NOTES字符串。否则,如果它没有数据,我只想返回一个空字符串或 null。

截图(执行的存储过程):

如果找到数据。在我的 Web 服务器端程序中,它获取数据。

如果有数据

如果没有数据。在我的 Web 服务器端程序中,它会导致NullReferenceException

如果没有数据

4

3 回答 3

4

如果只有一条记录是可能的,那么:

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)
于 2018-11-06T06:02:56.770 回答
1

我喜欢的另一种方法是使用虚拟值和 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;
于 2018-11-06T15:44:52.317 回答
0

在您的网络编程级别检查If(DataTable.Rows.Count >0)检查以避免NullReferenceException. 根据条件,您可以决定如何处理 Web 程序中的进一步逻辑。

从编程级别处理此类异常总是明智的想法。想想其他人在不知道代码的 Web 使用效果的情况下更改 SQL 查询的情况。

于 2018-11-06T06:11:25.587 回答