web-dev-qa-db-ja.com

選択カウント(*)値を整数に保存(SQL Server)

このselectステートメントから何が返されるのかについて私が無知であることに疑いの余地がないため、私はこのステートメントに問題を抱えています。

declare @myInt as INT
set @myInt = (select COUNT(*) from myTable as count)

if(@myInt <> 0) 
begin
   print 'there's something in the table'
end

MyTableにはレコードがありますが、上記のコードを実行すると、printステートメントは実行されません。さらにチェックすると、上記の割り当て後、myIntが実際にゼロになっていることがわかります。私は何かが欠けていると確信していますが、選択カウントが上記で使用できるスカラーを返すと仮定しましたか?

17
larryq

@myIntがゼロの場合、テーブルに行がないことを意味します。設定しない場合はNULLになります。

テーブルに行がない場合でも、COUNTは常に行を返します。

編集、2012年4月:このルールは、ここでの私の回答で説明されています: COUNT(*)は常に結果を返しますか?

あなたのカウント/割り当ては正しいですが、どちらの方法でも可能です:

select @myInt = COUNT(*) from myTable
set @myInt = (select COUNT(*) from myTable)

ただし、行の存在だけを探している場合は、(存在しない)EXISTSの方が効率的です:

IF NOT EXISTS (SELECT * FROM myTable)
37
gbn
select @myInt = COUNT(*) from myTable
11
user151323
Declare @MyInt int
Set @MyInt = ( Select Count(*) From MyTable )

If @MyInt > 0
Begin
    Print 'There''s something in the table'
End

これがあなたの問題であるかどうかはわかりませんが、printステートメントの単一引用符を2番目の単一引用符でエスケープする必要があります。 SELECTを使用して変数を設定することもできますが、ここで行ったようにSETを使用することで、IMOをより明確かつ明確にすることができます。さらに、Count(*)が負の値を返さないことが保証されるため、ゼロより大きいかどうかを確認するだけで済みます。

5
Thomas

[更新]-まあ、私自身の愚かさはこれに対する答えを提供します。結局のところ、select COUNTステートメントを実行する前にmyTableからレコードを削除していました。

どうすれば気づかずにそれをしたのですか?聞いてくれてうれしい。私はsql単体テストプラットフォーム (tsqlunit、興味があるなら) をテストしてきました。テストの一部として、truncate tableステートメントを実行してから、上記を実行しました。単体テストが終了すると、すべてがロールバックされ、レコードがmyTableに戻ります。そのため、テスト以外で記録を数えました。

皆さんごめんなさい...あなたの助けに感謝します。

2
larryq