Forum Webscript.Ru

Общие => Базы данных => Тема начата: Xander от 29 Сентября 2003, 21:41:34

Название: теоретический вопрос: следующая запись в произвольном рекордсете
Отправлено: Xander от 29 Сентября 2003, 21:41:34
Допустим есть произвольный рекордсет - упорядочен по алфавиту и еще по двум независимым числовым столбцам. Есть уникальные ID, которые идут вразбивку. Задача: найти следующую строку после произвольной строки с известным ID.

Мне пока что пришел в голову только следующий вариант:
1. выбрать строку с известным ID и занести ключевые значения в локальные переменные
2. выбрать первую из множества строк, где все ключевые параметры больше, чем сохраненные в локальных переменных.

Что-то похоже я смог запустить в консоли MSSQL, но вот в скрипт я эти три команды перенести не могу, после объявления переменных они уже не видны в следующей команде:

Comm.CommandText="DECLARE @typeID int, @makerID int,@obj nvarchar(40);"
   Comm.Execute
   Comm.CommandText="SELECT @typeID=TypeID, @makerID=MakerID,@obj=Object FROM tth_tblCoordinate WHERE ID=32;"
   Comm.Execute
   Set test = Server.CreateObject("ADODB.Recordset")
   GetRS.CursorType = 1
   GetRS.LockType = 3
   GetRS.Open "SELECT TOP 1 FROM tth_tblCoordinate WHERE TypeID>@typeID AND MakerID>@makerID AND Object>@obj", adoCon

-------------------
Microsoft OLE DB Provider for SQL Server ошибка \'80040e14\'

Must declare the variable \'@typeID\'.


Похоже придется делать хранимую процедуру, но делать это ради такого пустяка не хочется.

Гляньте пожалуйста, я не упустил простых и очевидных решений?
А то больно громоздко получается.
Название: теоретический вопрос: следующая запись в произвольном рекордсете
Отправлено: Макс от 29 Сентября 2003, 22:44:06
Xander
может я не так понял, что понимается под фразой:
Цитировать
Допустим есть произвольный рекордсет
У тебя уже есть экземпляр класса ADODB.RecordSet ? Если так, почему не пройтись по нему и не найти нужную запись. Рекордсет ведь упорядочен как надо. Находишь запись с указанным ID, тогда следующая  запись будет та, что тебе нужна.

ЗЫ
насчет твоего примера, а почему ты заносишь данные в локальные переменные MSSQL ? Разве нельзя занести в локальные переменные VB ? (я ASP не знаю, так что могу задавать глупые вопросы)
Название: теоретический вопрос: следующая запись в произвольном рекордсете
Отправлено: Xander от 29 Сентября 2003, 22:57:29
Не хотел лишние данные гонять между скриптом и базой, так что о использовании рекордсета целиком и не подумал. Некрасиво как-то...

а с локальными переменными vb все можно гораздо проще сделать, чем так, как я сначала сказал. В два запроса правда.

Зря я сразу себя средствами SQL ограничил :)
Название: теоретический вопрос: следующая запись в произвольном рекордсете
Отправлено: Xander от 30 Сентября 2003, 14:05:27
Что-то странное у меня получается.

Мне, по сути, нужно из всех результатов, возвращаемых запросом
SELECT ID,MakerID,TypeID,Object FROM tth_tblCoordinate ORDER BY TypeID,MakerID,Object

выбрать ту строку ,которая находится непосредственно под какой-то строкой с известным ID.
Вот, допустим я за один запрос выбрал нужные значения в переменные TypeID, MakerID,Object.
Дальше такой запрос:

query="SELECT * FROM (tth_tblCoordinate) WHERE "
query = query & "(TypeID>" & TypeID & " AND MakerID> "& MakerID &") OR "
query = query & "(TypeID=" & TypeID & " AND MakerID="& MakerID &" AND Object>\'" & Object & "\') "
query = query & "ORDER BY TypeID,MakerID,Object"

Но он выдает не совсем то, что мне нужно. Упорядочивание уже по-другому идет, записи идут не в том порядке.

Ни у кого идей нету?

А то с пролистыванием полного рекордсета непосредственно в скрипте медленно получается.
Название: теоретический вопрос: следующая запись в произвольном рекордсете
Отправлено: Phoinix от 30 Сентября 2003, 15:28:12
Xander
Я для таких вещей обычно использую зеркальный массив, т.е. при выборке данных из базы я присваиваю элементу массива ID значение номера строки.

@mass[ID] = (номер строки запроса);
Название: теоретический вопрос: следующая запись в произвольном рекордсете
Отправлено: Xander от 30 Сентября 2003, 20:15:36
Phoinix
не совсем понял, это делается непосредственно при выборке из базы, или уже в скрипте, обрабатывающем результат запроса?