row_number
是最好的方法,但由于您只想要一行,请务必查看计划。识别所需的行然后连接回原始表以检索其他列可能会更好。
WITH T1
AS (SELECT *,
ROW_NUMBER() OVER (ORDER BY number) AS RN
FROM master..spt_values)
SELECT name,
number,
type,
low,
high,
status
FROM T1
WHERE RN = 1000;
给
表'spt_values'。扫描计数 1,逻辑读取2005
CPU 时间 = 0 毫秒,经过的时间 = 19 毫秒。

WITH T2
AS (SELECT number,
type,
name,
ROW_NUMBER() OVER (ORDER BY number) AS RN
FROM master..spt_values)
SELECT TOP 1 C.name,
C.number,
C.type,
C.low,
C.high,
C.status
FROM T2
CROSS APPLY (SELECT *
FROM master..spt_values v
WHERE v.number = T2.number
AND v.type = T2.type
AND ( v.name = T2.name
OR ( v.name IS NULL
AND T2.name IS NULL ) )) C
WHERE RN = 1000;
给
表'spt_values'。扫描计数 1,逻辑读取7
CPU 时间 = 0 毫秒,经过时间 = 1 毫秒。
