powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование FOR XML
5 сообщений из 5, страница 1 из 1
Использование FOR XML
    #32009912
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые коллеги!
Помогите, пожалуйста, найти решение. Боролся много дней...

Я генерю 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???
...
Рейтинг: 0 / 0
Использование FOR XML
    #32009916
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку в текущей версии в 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 это будет еще проще.
...
Рейтинг: 0 / 0
Использование FOR XML
    #32009936
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ. Но всё-таки вопросы остаются.

В результате выполнения SELECT ... FOR XML получаем рекордсет, состоящий из одного поля типа ntext; это правильно, ведь этот тип подходит результат в него укладывается; непонятно, зачем нужен новый тип XML.
Если такой рекордсет получить запросом без XML, то сделать insert в другую таблицу можно, но если с XML - нельзя.
Объяснить мне это не удаётся. Единственное, что можно предположить - разработчики вставляли эту возможность аврально и сделали в обход общей схемы работы селектов. Например, SELECT ... FOR XML выдаёт специальный тэг, который перехватывается модулем связи с кл. приложениями, а он уже формирует XML текст. Т.е. опция FOR XML работает не в ядре сервера, а снаружи. Это печально.

Собственно, я решил задачу через OPENROWSET, только возникает проблема с секюрити (не знает-ли кто, как это преодолеть???).

Совет "выносить на клиента (или в middleware)" мне нравится, однако не всегда пригоден.
Собственно, это серьёзная проблема - микрософт сейчас всеми силами пытается прекратить использование MS SQL Server как самостоятельного продукта, предлагая связку middleware-SQL Server, что очень разумно в смысле маркетинга.
...
Рейтинг: 0 / 0
Использование FOR XML
    #32009949
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну нет, нет. Категорически не согласен. 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. Я надеюсь, что в следующей версии эта ситуация изменится в значительно лучшую сторону.
...
Рейтинг: 0 / 0
Использование FOR XML
    #32009965
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример из 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
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование FOR XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]