получить идентификатор предыдущей строки с помощью хранимой процедуры

#sql #sql-server-2005

#sql #sql-server-2005

Вопрос:

Мое требование, подобное этому:

Я должен извлечь строку из таблицы «A». Теперь я должен перебрать все строки и получить значения из ID столбца. Если я получу ID = 5 , то я хочу выполнить некоторую хранимую процедуру, с помощью которой я получу предыдущую строку идентификатора из некоторой таблицы «B». Нравится

 select * from table b where ID = 4
  

Купить мой вопрос: если кто-то удалил эту строку из базы данных (например, какой-то пользователь удалил строки с идентификаторами 3 и 4) — тогда как я могу получить строку с id = 2 из базы данных?

Пожалуйста, дайте мне какую-нибудь хранимую процедуру sql для получения предыдущей записи идентификатора из таблицы.

Комментарии:

1. Вам нужно перестать думать о циклическом просмотре строк. Вы НИКОГДА не перебираете строки, если можете с этим справиться. Научитесь выполнять действия в наборах.

Ответ №1:

Трудно понять, что именно вы ищете — может быть, что-то вроде этого??

 CREATE PROCEDURE dbo.FetchPreviousRow @ID INT
AS BEGIN

   SELECT TOP 1 ID, (other columns.....)
   FROM dbo.TableB
   WHERE ID < @ID
   ORDER BY ID DESC

END
  

При этом будет выбрана строка с наибольшим идентификатором, меньшим, чем тот @ID , который вы передаете, поэтому:

 EXEC dbo.FetchPreviousRow @ID = 5
  

вернет строку с ID = 4 — если она существует. В противном случае он вернет строку с ID = 3 — если она существует. В противном случае строка с ID = 2 — и так далее….

Ответ №2:

Следующий запрос должен получить его для вас:

 select max(ID) from YourTable where ID < @YourID
  

@YourID является ли переменная, содержащая ваш недавно вставленный идентификатор

Ответ №3:

Как насчет выбора всех идентификаторов меньше 5 и сортировки их по идентификатору. Тогда первым результатом будет тот, который вы хотите.