18

私が現在書いているプログラムには、テーブルが空かどうかを確認する必要があるポイントがあります。私は現在、基本的なSQL実行ステートメントを持っています

Count(asterisk) from Table

次に、この 1 つの行を取得するための fetch メソッドをCount(asterisk)用意し、それをパラメーターに入れてチェックできるようにします (テーブルが空であることを意味するため、count(*) < 1 の場合はエラー)。平均して、count(asterisk)約 11,000 行が返されます。このようなものはより効率的でしょうか?

 select count(*) 
 from (select top 1 * 
        from TABLE)

しかし、これを Microsoft SQL Server で動作させることはできません

これは 1 または 0 を返し、ステートメントが実行されたときにプログラミング言語でこれをチェックし、count パラメータをフェッチして TABLE が空かどうかを確認できます。

コメント、アイデア、または懸念事項は大歓迎です。

4

7 に答える 7

34

テーブルが空かどうかの表示を探しています。そのため、SQL には EXISTS キーワードがあります。ストアド プロシージャ内でこれを行う場合は、次のパターンを使用します。

IF(NOT EXISTS(SELECT 1 FROM dbo.MyTable))
BEGIN
  RAISERROR('MyError',16,10);
END;

インジケーターがアプリ内で適切に動作するようになった場合は、次のパターンを使用します。

SELECT CASE WHEN EXISTS(SELECT 1 FROM dbo.MyTable) THEN 0 ELSE 1 END AS IsEmpty;

他の応答のほとんども望ましい結果を生成しますが、それらは意図をあいまいにしているように見えます。

于 2013-06-24T21:06:05.687 に答える
3

について書きたかったEXISTSのですが、Sebastian Meine の方が早く書きました。を使用することをお勧めしEXISTSますが、もう 1 つの方法があります。

SELECT rows 
FROM sys.partitions 
WHERE object_id = object_id('MyTableName') 
    AND partition_number = 1
于 2013-06-24T21:11:10.197 に答える
3

存在を確認するときは、トップ 1 を使用してください。これがないと、レコードの数と同じ数の「1」が存在することになります。

IF NOT EXISTS(select top 1 1 from Table)
BEGIN
  RAISERROR('Error',0,1);
END;
于 2021-04-29T11:58:38.137 に答える
2

あなたのバリエーションは大丈夫です。サブクエリにエイリアスが必要なだけです。

 select count(*) 
 from (select top 1 * 
        from TABLE
      ) t
于 2013-06-24T20:48:25.080 に答える
2

これは、あなたが望むものを得る奇妙な方法のようです。代わりに使えますHAVINGか?

SELECT id, name FROM TABLE
GROUP BY id, name
HAVING COUNT(*) > 0
于 2013-06-24T20:42:21.597 に答える