Ошибка - это то, что сообщается. Используя опцию 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.