Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.049 c
1-1083011604
webmaster
2004-04-27 00:33
2004.05.16
определение координат при WordWrap


7-1081164882
mfasakhov
2004-04-05 15:34
2004.05.16
Определить начало кадрового импульса


1-1083137100
Fast
2004-04-28 11:25
2004.05.16
Crypto 3DES


1-1083173091
KEBZ
2004-04-28 21:24
2004.05.16
DLL и текст


1-1083230142
Dysan
2004-04-29 13:15
2004.05.16
как текст перекодировать из ISO в win-1251