Опубликовано: 19 окт 02
Рейтинг:
Рейтинг:
Автор: Glory
Прислал:
Если get_xml - это процедура, в которой запускается XML запрос, то ее результаты можно вывести во внешний файл таким образом
DECLARE @result int DECLARE @OutputFileName varchar(150) DECLARE @cmd varchar( 150) Set @OutputFileName = 'c:\mysql.xml' Set @cmd = 'BCP "EXEC get_xml" queryout "' + @OutputFileName + '" -C ACP -c -r -T' EXEC @result = master..xp_cmdshell @cmd(BCP.EXE - это утилита, поставляемая с SQL сервером.)
Примечание
Eсли в запросе выбираются данные с кирилическими символами, то вместо аргументов '-C ACP -c' нужно использовать '-w -C1251'.
Т.к. в результатах XML запроса отсутсвует пара тэгов <root></root>, то для того, чтобы полученный файл можно было просматривать в браузере эти теги нужно добавить "вручную". Это можно сделать следующими способами
1. С помощью дополнительной таблицы/переменной типа таблица.
CREATE PROCEDURE dbo.get_xml as SET NOCOUNT ON declare @t table(fake_id varchar(10) ) select fake_id, name from @t root full outer join (select top 10 name, id from sysobjects) AS sysobjects ON 1=1 for xml auto, elements
В этом примере вы получите XML вида
<root><Element1><Attribute1>Value<Attribute1/><Attribute2>Value"<Attribute2/>....<Element1/></root>
2. С помощью for xml explicit
CREATE PROCEDURE dbo.get_xml as SET NOCOUNT ON select 1 as Tag, NULL as Parent, NULL as [root!1], NULL as [sysobjects!2!name], NULL as [sysobjects!2!id] UNION all SELECT TOP 10 2, 1, NULL, name as [sysobjects!2!name], id as [sysobjects!2!id] from sysobjects for xml explicitВ этом примере вы получите XML вида
<root><Element1 Attribute1="Value" Attribute2="Value"..../>....</root>
Кроме того записать результаты XML запроса в файл можно с помощью простого VB Scripta
On Error Resume Next Public cnn, rst, strXML, strConn Set cnn = CreateObject("ADODB.Connection") Set rst = CreateObject("ADODB.Recordset") strConn = "PROVIDER=MSDASQL;DRIVER={SQL Server};" & _ "SERVER=<yourserver>;" & _ "DATABASE=<yourdb>;" & _ "UID=<yourlogin>;" & _ "PWD=<yourpasswd>;" & _ "Network=DBMSSOCN;" & _ "Address=<ip-address,port-number>;" & _ "UseProcForPrepare=0;" & _ "AutoTranslate=No" With cnn .ConnectionString = strConn .Open strConn End With If cnn.State = 1 Then Set rst = cnn.Execute("SELECT * FROM [MYTABLE] FOR XML RAW") If rst.State = 1 Then strXML = "" While Not rst.EOF strXML = strXML & rst.Fields(0).Value rst.MoveNext Wend rst.Close End If cnn.Close End If WScript.Echo strXML
Комментарии
Чтобы добавить тег root, достаточно указать параметр ROOT ))) Например: FOR XML AUTO, ROOT, ELEMENTS XSINIL
'-w -C1251'
-w, вроде, означает, что выгружаться будет в Юникоде. получается, что тогда неважно что писать с параметром -C