Должен объявить скалярную переменную @header - PullRequest
1 голос
/ 09 июля 2019

У меня проблема с bcp для создания XML-файла.

Если я выполню один запрос

SELECT @header, @inland 
FOR XML RAW(''), ROOT('root'), ELEMENTS, TYPE

, я получу правильные данные XML.

Но еслия вставляю запрос в exec master..xp_cmdshell

declare @cmd varchar(2000) = 'bcp "SELECT @header,@inland FOR XML RAW(''''),ROOT(''root''), ELEMENTS, TYPE" queryout "\\server01\TEMP_SW\XML_TMS\test_'+@num+'.xml" -U xx -P xxxxx -c -C ANSI -t;' ;
exec master..xp_cmdshell @cmd;

Система возвращает ошибку

SQLState = 37000, NativeError = 137
Ошибка = [Microsoft] [SQLСобственный клиент] [SQL Server] Должен объявить скалярную переменную "@header".

SQLState = 37000, NativeError = 8180
Ошибка = [Microsoft] [Собственный клиент SQL] [SQL Server] Не удалось подготовить оператор (ы).

@header объявлен как XML

Где ошибка?

Спасибо и всего наилучшего

1 Ответ

0 голосов
/ 10 июля 2019

Ошибка - это то, что сообщается. Используя опцию QUERYOUT BCP, вы получаете новое отдельное соединение SQL, внутри которого выполняется ваш оператор SQL (на самом деле это xp_cmdshell, который сначала открывает новый поток ОС ... затем bcp-queryout открывает новое соединение SQL). Этот оператор ничего не знает ни о каких предыдущих инструкциях «объявлять» или «устанавливать / выбирать», которые вы, возможно, выполняли перед командой xp_cmdshell. Поэтому, рассматривая ваш оператор SQL как самостоятельный запрос, вы, конечно же, получите ошибку, что ваши переменные не были определены.

Чтобы сделать то, что вы пытаетесь сделать, можете ли вы просто разрешить значения ваших переменных при построении строки @cmd? Как это:

declare @cmd varchar(2000)
select @cmd = 'bcp "SELECT ' + @header + ',' + @inland + ' FOR XML RAW(''''),ROOT(''root''), ELEMENTS, TYPE" queryout "\\server01\TEMP_SW\XML_TMS\test_'+@num+'.xml" -U xx -P xxxxx -c -C ANSI -t;' ;
exec master..xp_cmdshell @cmd;

Похоже, что вы уже делаете это с переменной @num, которую вы добавите в строку позже. Просто сделайте то же самое с переменными @header и @inland.

...