Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизStored procedure (MSSQL2000): произвольный набор параметров Найти похожие ветки
← →
BPK (2004-04-16 10:31) [0]Дано:
1. MS SQL Server 2000
2. ADO
3. Delphi 5
Надо:
иметь возможность передавать хранимой процедуре совершенно произвольный набор совершенно произвольных параметров.
В ADO это можно сделать с помощью CreateParameter, но при объявлении ХП в MS SQL Server нужно чётко указать, какие параметры используются. Как быть? Хотелось бы обойтись без XML и других подобных извращений.
← →
bushmen © (2004-04-16 10:34) [1]Только возникает вопрос - а ЗАЧЕМ такое может понадобится?
← →
tERRORist © (2004-04-16 10:38) [2]Перредавай один строчный параметр, а его уже парсь в ХП
← →
BPK (2004-04-16 10:51) [3]По порядку:
1. Понадобиться это может затем, что в БД хранятся сведения об объектах, причём каждый из объектов может иметь от нуля до N параметров произвольного типа (int, float, image, nvarchar и т.д.)
2. Через строчный параметр не годится: у него ограничена длина, и кроме того придётся использовать разделители. А разделители могут встретиться и внутри самого значения параметра.
← →
Hooch © (2004-04-16 10:52) [4]в данном случае XML лучшее решенье ! :-)
← →
BPK (2004-04-16 10:54) [5]Пардон, а чем парсить/кодировать XML? Вручную лень. Есть ли готовые средства, которые можно применить внутри ХП и в приложении Delphi?
← →
Delirium © (2004-04-16 10:54) [6]"Хотелось бы обойтись без XML и других подобных извращений" - с вышеозначеной постановкой задачи, обходиться без XML будет либо - неуч, либо - извращенец. 8)
← →
BPK (2004-04-16 10:55) [7]Ещё раз повторяю вопрос:
чем парсить/кодировать XML? Вручную лень. Есть ли готовые средства, которые можно применить внутри ХП и в приложении Delphi?
← →
Delirium © (2004-04-16 10:57) [8]
declare @XMLHandle int
exec sp_xml_preparedocument @XMLHandle OUTPUT, "
<Order>
<Product>
<Name>String1</Name>
<Price>111</Price>
</Product>
<Product>
<Name>String2</Name>
<Price>222</Price>
</Product>
</Order>"
select *
from openxml(@XMLHandle, "Order/Product", 2)
with (Name varchar(8000),
Price money)
exec sp_xml_removedocument @XMLHandle
← →
Hooch © (2004-04-16 11:17) [9]внутри sql server читай BOL, генерить xml на клиенте можно и ручками, если рабирать на клиенте ипортируй библиотеку типов ms xml 3 и все. да, что б на sql server нормально работаь с xml обязательно !!! 3 апдейт накотить надо
← →
BPK (2004-04-16 11:31) [10]>апдейт накотить надо
наверное от слова "кот"...
ломает меня update накатывать. Геморройно это получается. Что ни полезная идея, то апдейт, причём его ещё нужно где-то искать.
Через XML делать не стану, т.к. сам XML передаётся через varchar/nvarchar, но у меня возникла идея: что если добавлять параметры поодиночке - отдельными вызовами ХП, а затем послать запрос на вызов ХП:
ПодготовитьВызов
ПослатьПараметр("Par1",156)
ПослатьПараметр("Par2","the string")
ПослатьПараметр("Par1",True)
ВызватьПроцедуру
Всё это вызовы отдельных ХП.
Хранить параметры можно во временной таблице. Но только вот в связи со временной таблицей есть несколько непонятных моментов:
1. Я слышал, что временная таблица существует только на время сессии, а затем уничтожается. Как сделать так, чтобы таблица не уничтожалась с момента "ПодготовитьВызов" до момента "ВызватьПроцедуру" (а затем всё-таки была автоматически уничтожена - вдруг что-нибудь зависнет, и я не смогу сделать drop)
2. Система многопользовательская. Если создаётся временная таблица, то будет ли у каждого пользователя свой экземпляр (надо), или таблица будет общая (не надо)?
← →
Delirium © (2004-04-16 11:39) [11]"Через XML делать не стану" - откровенная глупость.
"будет ли у каждого пользователя свой экземпляр (надо), или таблица будет общая (не надо)" - читай хелп про # и ##.
P.S.
"ПодготовитьВызов
ПослатьПараметр("Par1",156)
ПослатьПараметр("Par2","the string")
ПослатьПараметр("Par1",True)
ВызватьПроцедуру" - ахинея это, если хочешь через временные таблицы работать, опять таки надо пользовать XML, но теперь ADO-шный (http://delphibase.endimus.com/?action=viewfunc&topic=basemssql&id=10400).
← →
BPK (2004-04-16 11:54) [12]> "Через XML делать не стану" - откровенная глупость.
Ну и как запихать BLOB в XML?
← →
Delirium © (2004-04-16 11:55) [13]Я тебе кинул линк
← →
BPK (2004-04-16 11:57) [14]> Я тебе кинул линк
Куда кинул? Я свой e-mail не указывал.
← →
Delirium © (2004-04-16 12:02) [15]В 11-й пост!
← →
Nikolay M. © (2004-04-16 12:04) [16]
> "Хотелось бы обойтись без XML и других подобных извращений"
> - с вышеозначеной постановкой задачи, обходиться без XML
> будет либо - неуч, либо - извращенец. 8)
Если ты первое, второе или третье, то возможен вариант с псведовременными таблицами такого примерно формата:
ID, SPID, param_name, param_value
где SPID - сессия коннекта.
Заполняешь таблицу значениями, вызываешь процедуру, она их считывает.
← →
Hooch © (2004-04-16 12:13) [17]>> Ну и как запихать BLOB в XML?
Base64
Я раньше тоже через временные делал, но через XML удобнее, когда привыкнеш :-)
← →
Delirium © (2004-04-16 12:19) [18]"Base64" - на самом деле для полей binary, varbinary и image - MSSQL воспринимает обычный HEX, а именно в HEX-е хранятся BLOB-ы при ADO-шной сериализации, так что процедура по линку из 11-го поста работает и с BLOB-ами.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c