Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1082537942
Vopros
2004-04-21 12:59
2004.05.16
Encrypted dBASE tables как открыть?


7-1081312087
Sergey N
2004-04-07 08:28
2004.05.16
Перехват Shutdown Windows.


1-1083000274
I.Ru.Ru
2004-04-26 21:24
2004.05.16
Автоширина в StringGride и Gride


1-1083232433
KEBZ
2004-04-29 13:53
2004.05.16
Text


14-1082630020
ASMiD
2004-04-22 14:33
2004.05.16
Маленький празник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский