Запустите SQLCMD через пакетный скрипт, чтобы создать отформатированный XML-файл из сохраненной транзакции.

Я пытаюсь автоматизировать процесс запуска хранимой процедуры в базе данных с помощью SQLCMD. SQL Server Management Studio 2008 установлен на Windows Server, в котором все это пытается произойти. SQLCMD будет вызываться через пакетный сценарий, и ему будет предложено выполнить хранимую процедуру и сохранить вывод в файл XML. Я не могу показать хранимую процедуру, так как она содержит конфиденциальный материал, но включает использование FOR XML PATH('').

Я прочитал несколько статей со всевозможных сайтов, и люди говорили, что используют :XML ON для получения вывода в реальном формате XML, а не в табличном формате, а также переключатели «-h-1 -y 0», чтобы убедиться что вывод не усекается. Я пытаюсь запустить SQLCMD через пакетный скрипт, чтобы все это можно было автоматизировать.

Мой текущий пакетный скрипт (все переменные определены перед этой строкой в ​​скрипте):

    sqlcmd -X -Q -h-1 -y 0 "EXEC %TransactionName%" -d %Database% -S %ServerInstance% -o "%OutFilename%_%currDATE%.xml"

Я попытался добавить :XML ON в транзакцию, а также создать отдельный скрипт SQL, который гласит:

    Run_Transact.sql
    :XML ON
    EXEC storedProcedure

и поэтому командный файл будет читать:

    sqlcmd -X -Q -h-1 -y 0 -i runTransact.sql -d %Database% -S %ServerInstance% -o "%OutFilename%_%currDATE%.xml"

Я возвращаю ошибку:

HResult 0x80004005, уровень 16, состояние 1 Описание не предоставлено

Если я не использую :XML ON, то я получаю вывод, который выглядит так, как будто он в табличном формате, и он включает заголовок, а также только первую запись, но не всю ее (она усекается).

Мой вопрос: как я могу получить вывод в файле XML, чтобы он действительно выглядел как XML, а не усекался?

Большое спасибо заранее!


person Community    schedule 21.06.2012    source источник
comment
это может быть актуально: stackoverflow.com/q/11143215/27825   -  person Ed Harper    schedule 21.06.2012
comment
Привет Эд! Кажется, ссылка, которую вы разместили, все еще направлена ​​​​на мой вопрос ... Я думаю, что прочитал большинство сообщений в stackoverflow, связанных с моей проблемой, но если вы найдете тот, который я пропустил, я был бы очень благодарен. Спасибо за помощь!   -  person    schedule 21.06.2012


Ответы (1)


Этот подход работает для меня. Я получил 2 миллиона строк xml с помощью sqlcmd из столбца xml. Мои шаги:

1) Создайте файл с запросом, это мой:

:XML ON
USE <DB_NAME>
SELECT TOP 1 <COLUMN_NAME> FROM <TABLE>
WHERE <SOMETHING>
FOR XML PATH('')

2) Выполнить команду в sqlcmd

sqlcmd -d <DB_NAME> -i <PATH>\query.sql >result.txt

И замените то, что вам нужно в ‹>

В вашем случае у вас есть хранимая процедура. Может, это вызовет проблемы? Но вы можете попробовать что-то вроде;

USE<DB_NAME>
DECLARE @XMLV XML
EXEC @XMLV = EXEC StoredProcedure
SELECT @XMLV
FOR XML PATH('')

Я знаю, что вопрос довольно старый, но, возможно, это поможет кому-то.

person Jinx    schedule 11.06.2015