我在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
答案 0 :(得分:2)
如果您可以使用测量永远不会采用的值,则可以使用COALESCE()。
SET @val = (SELECT COALESCE(measurement, someValueThatDoesNotOccur) FROM tbl_data WHERE persid = @curpersid AND yr = @curyear)
没有行:@val == null
测量值为NULL:@val等于某个值
否则是一个vlaid测量
答案 1 :(得分:1)
或许查看@@ROWCOUNT
?但是,这有点冒险,因为在检查@@ROWCOUNT
(在大多数操作之后更新)之前,您需要确保不要执行任何其他操作。
或者,读取另一列,如主键:
SELECT @val = measurement, @id = id
FROM tbl_data WHERE persid = @curpersid AND yr = @curyear
现在检查@id
- 如果是NULL
,则没有行。
答案 2 :(得分:1)
我怀疑你为什么要循环?循环在SQL Server中是一件坏事,因为它是性能杀手。大多数东西都有更好的基于集合的解决方案。如果除了设置变量的值之外,如果你告诉我们你在循环中做了什么,也许你的问题有一个更好的解决方案。
答案 3 :(得分:0)
嗯,这有点像黑客,但是:
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,那么就没有行,如果测量值为null,则为null。