すべての行を返すSELECT TOPで使用できる値はありますか?


13

エンドユーザーがクエリによって返される行数を定義できるようにします(SELECT TOP(@x))。すべての行が返される場所に入力できる値はありますか?または、すべての行を返す必要がある場合、TOP(@x)なしでクエリを動的に作成する必要がありますか?

SQL Server 2012を使用しています。


それはTOP ... ORDER BY何か?ORDER BYすべてを選択した場合でも、何かが必要ですか?
マーティンスミス

1
ええと...を省略しただけだと思いますTOPか?事前定義されたクエリを処理していて、何かを渡す必要があります
corsiKa

回答:


17

PERCENTを使用していない場合、TOPBIGINTのように見えます。つまり、BIGINTの最大値を渡すことができます。

SELECT TOP (9223372036854775807) * FROM table1

私はあなたがこれほど大きなテーブルを見ることは真剣に疑っています。ただし、クエリプランにどのような影響があるかはわかりません。


7
変数@xがBIGINTであると仮定すると、SET @x = 0x7fffffffffffffff一部の人にとってより明確になる可能性があります。とにかく覚えやすいです。
マーティンスミス

@MartinSmith正直言って、どちらにせよ調べてみます:) それは暗黙的な変換ですか?
ケネスフィッシャー

7
そもそも最初から覚えていて7、残りの部分を覚えておけばF、8バイトで合計16文字が必要になります。はい、そのデータ型の変数に割り当てると、暗黙的に変換されます。
マーティンスミス

@MartinSmith値のバイナリ表現に依存するのは良い習慣ですか?ドキュメントは述べ値のバイナリ表現は、SQL Serverのバージョンにバージョンから変更される可能性があります。また、私がSqlServerの0x7fffffffffffffffmax値の表現で常に混乱している唯一の人物であるかどうかもわかりませんbigint。その理由は、SqlServerのバイナリ定数表記7fでは最下位バイトにあり、c ++のような言語では最上位バイトにあるため、符号付き整数型の最大値を取得できるからです。
i-one

3
@ i-one。整数型のバイナリ表現が変更されることはほとんどありません。特定の形式に依存できると予想されない場合、整数型で動作するビット演算子をSQL Serverに提供しても意味がありません。
マーティンスミス

12

あなたも検討することができます

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

の代わりに

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

@xに設定する必要がある値は0、無効にすることです。

これは、データ変更ステートメントでは非推奨ですが、では非推奨ではありませんSELECT

2012年にROWCOUNTは、0 の場合とゼロ以外の値の場合について、別の計画がコンパイルされます。

場合ORDER BY Bazに意味を与えるためだけに存在しているTOP結果を得るために提示順序を提供するために、あなたが2つのクエリには、この後、分割をサポートしている索引を持っていないではなく、不必要なソート避けるだろう0ケースを。


8

SELECT TOP 100 PERCENTを使用すると、クエリで「TOP」を使用する際のエラーを回避できます。


1
私にとって、それは最適化された機能を使用する理由を実際には説明していません。Crystal Reports は、ビュー定義にORDER BYがあることを期待していますか?
アンドリーM

いいえ、Crystal Reportsには、クエリを保持して独自の実行プランを強制する問題があり、非常に非効率的で、時には不正確になります。SQLクエリですべてのロジックとデザインを実行し、Crystalで単純に「きれい」にすることを好みます。これが、私が大部分をSSIS / SSRSに移行した理由ですが、まだレガシーレポートがあります。
-MguerraTorres

-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable

1
問題は、TOP句のパラメータ化についてです。OPにはすでにパラメーター(@x)があり、@xテーブルに実際にある行の数に関係なく「すべての行」を意味するように、渡す値を尋ねています。たぶん、OPの要件に合わせてソリューションを調整する方法を見つけることができます。
アンドリーM

1
質問に合うように調整しましたが、書かれているように、行が同時に挿入された場合、これは競合状態になります。これは、同時挿入をブロックすることを解決するために、期間中テーブルロックを必要とします。これと、そもそもチェックするための余分な費用は、単に大きな数を使用することで回避できます。
マーティンスミス

(SELECT COUNT(*) FROM YourTable)値ではありません。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.