Microsoft SQL Server
Transact-SQL

Вывод во внешний файл XML запроса

Опубликовано: 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



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Transact-SQL / Вывод во внешний файл XML запроса