Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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\'.
Похоже придется делать хранимую процедуру, но делать это ради такого пустяка не хочется.
Гляньте пожалуйста, я не упустил простых и очевидных решений?
А то больно громоздко получается.
-
Xander
может я не так понял, что понимается под фразой:Допустим есть произвольный рекордсет
У тебя уже есть экземпляр класса ADODB.RecordSet ? Если так, почему не пройтись по нему и не найти нужную запись. Рекордсет ведь упорядочен как надо. Находишь запись с указанным ID, тогда следующая запись будет та, что тебе нужна.
ЗЫ
насчет твоего примера, а почему ты заносишь данные в локальные переменные MSSQL ? Разве нельзя занести в локальные переменные VB ? (я ASP не знаю, так что могу задавать глупые вопросы)
-
Не хотел лишние данные гонять между скриптом и базой, так что о использовании рекордсета целиком и не подумал. Некрасиво как-то...
а с локальными переменными vb все можно гораздо проще сделать, чем так, как я сначала сказал. В два запроса правда.
Зря я сразу себя средствами SQL ограничил :)
-
Что-то странное у меня получается.
Мне, по сути, нужно из всех результатов, возвращаемых запросом
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"
Но он выдает не совсем то, что мне нужно. Упорядочивание уже по-другому идет, записи идут не в том порядке.
Ни у кого идей нету?
А то с пролистыванием полного рекордсета непосредственно в скрипте медленно получается.
-
Xander
Я для таких вещей обычно использую зеркальный массив, т.е. при выборке данных из базы я присваиваю элементу массива ID значение номера строки.
@mass[ID] = (номер строки запроса);
-
Phoinix
не совсем понял, это делается непосредственно при выборке из базы, или уже в скрипте, обрабатывающем результат запроса?