【问题标题】:Select statement return if there is a value and if there is no value如果有值,则选择语句返回,如果没有值
【发布时间】:2018-11-06 05:56:45
【问题描述】:

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

SELECT NOTES as DeletionNote 
FROM STCRCHF_LOG 
WHERE STHTR_ =  @transferNo

IF ( @@ROWCOUNT = 0) 

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

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

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

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

【问题讨论】:

  • 你会期望@transferNo 有多个行吗?
  • 旁注 - TransforNo 似乎是一个数字。为什么是 unicode 字符串?
  • 但是你不要在web程序级别处理NullReferenceException。在编程级别处理此类异常始终是一个明智的想法。
  • @Squirrel 我确实每个传输数据只有一个数据

标签: sql-server tsql stored-procedures ssms-2017


【解决方案1】:

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

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)

【讨论】:

  • 好答案,虽然别名应该在外部选择上。
  • 另外,请注意它只适用于返回单个值的选择语句。如果 select 语句返回多于一行,这将失败并显示“子查询返回超过 1 个值...”。
  • @ZoharPeled 我确实在每个传输号中只有一个数据。多谢你们!!我去看看!
  • 您为多行发布的解决方案与我想到的类似,但有一个例外:如果查询变得更复杂,对于第二种解决方案,我建议使用 cte 甚至表变量来保存结果(以防它是一个长时间运行的查询),而不是在exists 中重复整个查询。不过,如果可以的话,我会再次投票:-)
  • @ZoharPeled 同意 - 如果有额外的复杂性,我当然会这样做。谢谢你的客气话。
【解决方案2】:

我喜欢的另一种方法是使用虚拟值和 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;

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是什么让您认为这是一个网站?或者它甚至在 sql server 之外使用?
    • @zohar 问题有网络服务器端。大多数情况下,NullReferenceException 总是在我们在 sql server 之外调用 sql 代码时引发。我也没有使用任何网站。无论是任何编程语言,我建议的检查点都是编程最佳实践的一部分。我并不完美,至少我在努力假装。
    • 更正,我错过了……我想需要更多的咖啡。
    • 不用担心@Zohar .. 咖啡总是帮助我们总是去得到它。我希望我能加入咖啡桌:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多