Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование FOR XML
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги! Помогите, пожалуйста, найти решение. Боролся много дней... Я генерю XML, используя SELECT ... FOR XML Бизнес-логику не хочется выносить в клиента - она на сервере; и писать хочется структурировано. Т.е. общий XML формируется вызовами нескольких процедур. Проблема: я не могу нигде использовать результат SELECT ... FOR XML - сервер непозволяет. Например, нельзя написать: SELECT ... INTO #temp FROM ... FOR XML EXPLICIT Я использую одно решение: Если в процедуре MyXMLProc используется SELECT ... FOR XML, то я её вызываю: exec 'insert #tmp SELECT * FROM OPENROWSET(''MSDASQL'',''DRIVER={SQL Server};SERVER=myserver;DATABASE=mydatabase;UID=sa;PWD='lalala', ''exec MyXMLProc'')' В принципе, это работает, хотя так делать некрасиво. Но главная проблема - пользователя, который это запускает, нужно включить в группу System Administrators Как сделоть ЭТО? Как использовать результаты SELECT ... FOR XML??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 07:03 |
|
||
|
Использование FOR XML
|
|||
|---|---|---|---|
|
#18+
Поскольку в текущей версии в T-SQL отсутствует тип XML, то не выносить на клиента (или в middleware), наверное, не получится. Что касается использования на клиенте, то здесь сценарий прост. Создаем объект adoCommand, в CommandText кладем SELECT ... FOR XML ... (или в CommandStream кладем SQL Template), делаем Execute , , adExecuteStream и в Properties("Output Stream") получаем результат запроса в виде XML-документа. Затем над ним можно изгаляться при помощи DOM, т.е. читать элементы, св-ва, выполнять XSL-преобразования, напускать XPath-запросы и т.д. Примеры работы можно найти на MSDNe. См., напр., Data Access -> MDAC -> SDK Documentation -> ADO Programmers' Guide -> Retrieving Resultsets into Streams. Кстати, в ADO.Net это будет еще проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 08:37 |
|
||
|
Использование FOR XML
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Но всё-таки вопросы остаются. В результате выполнения SELECT ... FOR XML получаем рекордсет, состоящий из одного поля типа ntext; это правильно, ведь этот тип подходит результат в него укладывается; непонятно, зачем нужен новый тип XML. Если такой рекордсет получить запросом без XML, то сделать insert в другую таблицу можно, но если с XML - нельзя. Объяснить мне это не удаётся. Единственное, что можно предположить - разработчики вставляли эту возможность аврально и сделали в обход общей схемы работы селектов. Например, SELECT ... FOR XML выдаёт специальный тэг, который перехватывается модулем связи с кл. приложениями, а он уже формирует XML текст. Т.е. опция FOR XML работает не в ядре сервера, а снаружи. Это печально. Собственно, я решил задачу через OPENROWSET, только возникает проблема с секюрити (не знает-ли кто, как это преодолеть???). Совет "выносить на клиента (или в middleware)" мне нравится, однако не всегда пригоден. Собственно, это серьёзная проблема - микрософт сейчас всеми силами пытается прекратить использование MS SQL Server как самостоятельного продукта, предлагая связку middleware-SQL Server, что очень разумно в смысле маркетинга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 11:15 |
|
||
|
Использование FOR XML
|
|||
|---|---|---|---|
|
#18+
Ну нет, нет. Категорически не согласен. XML <> ntext никоим образом. Скорее, его можно рассматривать как разновидность recordset, представленного не в обычной tabular форме, а в виде дерева (semistructured). Поддержка XML в SQL Server самая что ни на есть native, потому что OLE DB-провайдер возвращает именно XML, а не текст. Вот если бы было так, как Вы предлагаете, т.е. кладем XML в BLOB в виде куска голого текста безотносительно его структуры, а затем парсим какой-то внешней по отношению к SQL Server тулой, тогда действительно можно было утверждать, что "микрософт сейчас всеми силами пытается прекратить использование MS SQL Server как самостоятельного продукта". Это неверно. Необходимость использования высокоуровневого средства разработки в сочетании с ADO.Net проистекает в нашем с Вами случае только по бедности T-SQL в плане работы с типами text и XML. Я надеюсь, что в следующей версии эта ситуация изменится в значительно лучшую сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 12:40 |
|
||
|
Использование FOR XML
|
|||
|---|---|---|---|
|
#18+
Пример из XML for Microsoft SQL Server 2000 Web Release 2 Beta 1, использующий SQLXMLOLEDB OLE DB provider: In this client-side ADO sample application, a simple SQL query is executed on the client. Because the ClientSideXML property is set to True, the SELECT statement without the FOR XML clause is sent to the server. The server executes the query and returns a rowset to the client. The client then applies the FOR XML transformation to the rowset and produces an XML document. The xml root property provides the single top-level root element for the resulting XML document. Option Explicit Sub main() Dim oTestStream As New ADODB.Stream Dim oTestConnection As New ADODB.Connection Dim oTestCommand As New ADODB.Command oTestConnection.Open "provider=SQLXMLOLEDB.2.0;data provider=SQLOLEDB;data source=(local);initial catalog=Northwind;user id=sa;password=;" oTestCommand.ActiveConnection = oTestConnection oTestCommand.Properties("ClientSideXML") = "True" oTestCommand.CommandText = "SELECT FirstName, LastName FROM Employees FOR XML AUTO" oTestStream.Open oTestCommand.Properties("Output Stream").Value = oTestStream oTestCommand.Properties("xml root") = "root" oTestCommand.Execute , , adExecuteStream oTestStream.Position = 0 oTestStream.Charset = "utf-8" Debug.Print oTestStream.ReadText(adReadAll) End Sub Sub Form_Load() main End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 20:05 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32009965&tid=1826134]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
4ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 264ms |
| total: | 383ms |

| 0 / 0 |
