Редактировать - только что понял, что вы всегда хотите, чтобы две строки были возвращены, переработать ...
Обновленный код:
SELECT * FROM @t WHERE ID = ( select top 1 id
from @t
where id <
case
when exists (select id from @t where id < @ID)
then @ID
else (@ID + 1)
end
order by id desc
)
UNION
SELECT * FROM @t WHERE ID = ( select top 1 id
from @t
where id >
case
when exists (select id from @t where id > @ID)
then @ID
else (@ID - 1)
end
order by id
)
Оригинальный пост ниже, прежде чем я понял, что именно вы хотели
Вы были очень близки, вам нужен оператор UNION
и одно небольшое изменение синтаксиса для вашего запроса.
SELECT * FROM [table] WHERE ID = (select top 1 id from @t where id < @ID order by id desc)
UNION
SELECT * FROM [table] WHERE ID = (select top 1 id from @t where id > @ID order by id)
Это вернет 1 строку, если переданный вами идентификатор - это первая или последняя строка, в противном случае - 2 строки.
Тестовый код:
DECLARE @t TABLE
(
Id int identity,
Col varchar(200)
)
INSERT INTO @t VALUES('column one')
INSERT INTO @t VALUES('column two')
INSERT INTO @t VALUES('column three')
INSERT INTO @t VALUES('column four')
INSERT INTO @t VALUES('column five')
DELETE FROM @t WHERE ID = 3
DECLARE @Id int
SET @Id = 3 -- Change this to other values to further test
SELECT * FROM @t WHERE ID = (select top 1 id from @t where id < @ID order by id desc)
UNION
SELECT * FROM @t WHERE ID = (select top 1 id from @t where id > @ID order by id)