2009-04-10 10 views
2

SQL Server 2005に測定データを格納したテーブルが用意されています。私のTSQLコードは、ループ内でこれらの値をフェッチし、それらを処理します。特定の人と年のために、NULLクエリ結果から空白を区別する

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

さて、テーブルには有効な測定を(i)を含むことができ、(ⅱ)NULL値または(III)対応する行はまったくありません。

これらのケースを効率的に区別するにはどうすればよいですか?どちらの(ii)および現在のコードで、彼らは...任意のヒントについて

おかげ束を区別することはできませんので、(III)、@valビーイングのNULLになり、

答えて

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が返されます。

+0

ありがとう、COALESCEの解決策は私のために最適なようです。また、SETを使用して、複数の行が返されたときに警告を発することができます。 – wwwald

1

をwwwaldおそらく@@ROWCOUNTをチェック?ただし、ほとんどの操作の後に更新された@@ROWCOUNTをチェックする前に、他の操作を行わないようにする必要があるため、これは少し危険です。

代わりに、主キーのような、別の列を読み取る:

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

@idチェック - それはNULLされている場合、行がなかったです。

+0

@@ ROWCOUNTを避けて、コードをより堅牢にすることをお勧めします。誰かがその間にクエリを挿入すると、すべてが壊れてしまいます。 – wwwald

+0

私はその点を強調し、より安全な選択肢を提案したと信じていますか? –

+0

はい、間違いなく。私はおそらくCOALESCEオプション(下記参照)に行きます。SETを使用し続けることができるからです。 いずれにしても、アイデアをありがとう! – wwwald

2

測定値が使用できない値を使用できる場合は、COALESCE()を使用できます。

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

ませ行:@val == nullの

測定がNULLではなかった:@valはsomeValueの

vlaid測定

1

なぜあなたはまったくループしているのですか? SQL Serverではループがパフォーマンスを低下させるので、ループは悪いことです。ほとんどのものは、より優れたセットベースのソリューションを持っています。変数の値を設定するだけでなく、ループで何をしているのかを教えれば、問題が解決する可能性があります。

関連する問題