Это даст NULL
для предыдущего в первом ряду и NULL
для следующего в последнем.Хотя ваш порядок кажется мне задом наперед;почему «следующий» ниже, чем «предыдущий»?
CREATE PROCEDURE dbo.GetGalleryBookends
@GalleryID INT
AS
BEGIN
SET NOCOUNT ON;
;WITH n AS
(
SELECT galleryID, rn = ROW_NUMBER()
OVER (ORDER BY galleryID)
FROM dbo.gallery
)
SELECT
previousrec = MAX(nA.galleryID),
nextrec = MIN(nB.galleryID)
FROM n
LEFT OUTER JOIN n AS nA
ON nA.rn = n.rn - 1
LEFT OUTER JOIN n AS nB
ON nB.rn = n.rn + 1
WHERE n.galleryID = @galleryID;
END
GO
Также не имеет смысла хотеть пустую строку вместо NULL
.Ваш ASP-код может нормально работать со значениями NULL
, иначе вам придется каждый раз преобразовывать полученные целые числа в строки.Если вы действительно этого хотите, вы можете сказать:
previousrec = COALESCE(CONVERT(VARCHAR(12), MIN(nA.galleryID)), ''),
nextrec = COALESCE(CONVERT(VARCHAR(12), MAX(nB.galleryID)), '')
Но это больше не будет работать хорошо при переходе от ASP к ASP.NET, потому что типы гораздо более явные.Гораздо лучше иметь код приложения, с которым можно справиться, вместо того, чтобы бояться значений NULL
.
Это похоже на большую работу, чтобы получить предыдущий и следующий идентификатор, не извлекая никакой информациио текущем ID.Вы реализуете пейджинг?Если это так, я настоятельно рекомендую прочитать эту статью и этот последующий разговор .