T-SQLの小技?を一つ。
MySQLでは、以下のようにSELECT文にLIMIT句を指定して、クエリ結果から指定オフセットから指定件数分取得することが可能。
SELECT ・・・ FROM TABLE_NAME ・・・ LIMIT 10,5 -- クエリ結果の5行目から10行分
-- または
SELECT ・・・ FROM TABLE_NAME ・・・ LIMIT 10 OFFSET 5 -- クエリ結果の5行目から10行分ではT-SQLで同じ事を行なう場合はどうすれば良いのか?
昔はスマートなやり方はなかったが、SQL Server 2012からは以下の構文で取得が可能となったようだ。(但し、ORDER BY句の一部だが・・・)
-- クエリ結果の@START_OFFSET行目から@FETCH_NUMBER行分取得
SELECT COLUMN_1[,COLUMN_2[,...]] FROM TABLE_NAME
・・・
ORDER BY KEY_COLUMN
OFFSET @START_OFFSET ROWS
FETCH NEXT @FETCH_NUMBER ROWS ONLY※↓EFでSQL Serverに対して.Skipや.Takeを使用すると、上記と同様なSQLが作成された。
var q = ctx.TABLE_NAME.OrderBy(v=>v.KEY_COLUMN).Skip(n).Take(m);SELECT ・・・
FROM TABLE_NAME AS [T]
ORDER BY [T].[KEY_COLUMN]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLYこれって結構使う機能だと思うのだけど、T-SQLでサポートされていたとは知らなかった(^^;





Users Today : 2
Users Yesterday : 37
Users Last 7 days : 186
Users Last 30 days : 1080
Users This Month : 1009
Users This Year : 4357
Total Users : 98872
Views Today : 3
Views Yesterday : 46
Views Last 7 days : 239
Views Last 30 days : 1280
Views This Month : 1203
Views This Year : 5260
Total views : 137706
Who's Online : 0
ちなみに、EFクエリでTakeだけだと、
“SELECT TOP n ・・・”
Skipだけだと、
“・・・ORDERBY KEY_COLUMN OFFSET n ROWS”
が生成されるようだ。
EFクエリに.OrderByを付けない場合はログ上にはWarningが吐かれ、下記のようなSQLとなった。
SELECT ・・・
FROM [TABLE_NAME] AS [T]
ORDER BY (SELECT 1)
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY