2011-10-28 5 views
3

私は、ユーザーがすべてまたは一部のレコードを照会できるようにする必要があります。今、私はこれをやっている:TSQL:TOPの動的値

DECLARE @Limit INT = NULL 

IF @Limit IS NULL SELECT @Limit = COUNT(ID) FROM vwNotifications 

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title 
FROM vwNotifications 

は私がCOUNTクエリを使用せずにこれを行うことができます方法はありますか?

答えて

5

次の2つのオプション

1を持っているが、20億のようなトップ何かを作るが、その後、あなたが本当に2 billioを返すようにしたいagain..do 1回のショットでn行ですか?

DECLARE @Limit INT = NULL 

SELECT @Limit = COALESCE(@Limit, 200000000) 

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title 
FROM vwNotifications 

または

DECLARE @Limit INT = NULL 

IF @Limit IS NULL 

SELECT ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title 
FROM vwNotifications 

else 

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title 
FROM vwNotifications 
他の場合の対処
3

は整数でサポートされているよりも多くの行が含まれることはありません、あなたのテーブルを想定すると(つまり、プライマリキーは実際にはそうであるbigintよりもむしろint、です):

DECLARE @Limit INT = NULL 

IF @Limit IS NULL OR @Limit = 0 
    SET @Limit = 2147483647 -- Max Int 

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title 
FROM vwNotifications 

あなたの他のオプションは、if文でありますそして、それは0 であれば2つのクエリ..