xp_cmdshell Собственная ошибка 208, BCP в SQL Server 2008 R2

Я пытался работать над получением результата большого оператора SELECT с несколькими соединениями и отправить результат запроса по электронной почте в виде файла CVS. У меня есть правильный запрос и электронная почта, но у меня возникают проблемы с автоматизацией экспорта результата в виде файла CVS. Из того, что я читал, лучшим выбором для автоматического экспорта результатов запроса является инструмент под названием «BCP».

Я попытался использовать BCP в Management Studio следующим образом:

USE FootPrint;

DECLARE @sql VARCHAR(2048);
DECLARE @dir VARCHAR(50);

SET @dir = 'C:\Users\bailey\Desktop';
SET @sql = 'bcp "SELECT TOP 10 * FROM datex_footprint.Shipments" queryout "' + @dir + '" -c -t, -T';

EXEC master..xp_cmdshell @sql;

FootPrint — это имя конкретной базы данных, а datex_footprint — схема. (Это не настоящий запрос, просто тестовый).

Когда я запускаю это, я получаю сообщение об ошибке: «SQLState = S0002, NativeError = 208» «Ошибка = [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Недопустимое имя объекта «datex_footprint.Shipments».

Я на 100% уверен, что datex_footprint.Shipments является правильным доступом к схеме\таблице для данных, которые я пытаюсь протестировать.

Кто-нибудь видит, что я упускаю или делаю неправильно, пытаясь экспортировать этот результат в файл CSV? В частности, я пытаюсь автоматизировать этот процесс. Я знаю, как экспортировать результаты в CSV-файл, но хочу сделать это на T-SQL, чтобы автоматизировать создание файла по времени суток.

Любая помощь будет оценена по достоинству!


person Mister R2    schedule 25.09.2012    source источник


Ответы (3)


[РЕШЕНО]

Я понял, что я делаю неправильно. Я не идентифицировал представление в полной форме. Я использовал «schema.Table/View» вместо «database.schema.table/view». Кроме того, я добавил флаг «-S» + @@SERVERNAME — это указывает утилите BCP использовать для запроса сервер, к которому в данный момент подключен SQL Server.

Правильный код для создания CSV-файла результатов запроса SELECT в T-SQL, SQL Server 2008:

DECLARE @sql VARCHAR(8000);

SELECT @sql = 'bcp "SELECT * FROM FootPrint.datex_footprint.Shipments" queryout "C:\Users\bailey\Desktop\FlatTables\YamotoShipping.csv" -c -t, -T -S' + @@SERVERNAME;

exec master..xp_cmdshell @sql;

Итак, однажды я добавил «FootPrint». чтобы идентифицировать базу данных, это сработало.

ПРИМЕЧАНИЕ. Я использую SQL Server 2008 R2.

person Mister R2    schedule 26.09.2012

У меня такая же ошибка, но я решил ее по-другому. Я добавил базу данных по умолчанию к своему идентификатору, затем BCP начал просматривать таблицы в моей базе данных по умолчанию и обрабатывать файлы.

person Kumar Kannaveni    schedule 26.04.2016

После поиска и чтения документации bcp я обнаружил, что когда мы копируем данные, мы должны использовать временную таблицу GLobal, т.е. ## вместо #.. потому что в tempdb она будет конфликтовать и не позволит копировать данные в файл назначения.

Пример:

DECLARE @OutputFilePath nvarchar(max); SET @OutputFilePath = 'C:\OutputData'
DECLARE @ExportSQL nvarchar(max); SET @ExportSQL = N'EXEC xp_cmdshell ''bcp 
"SELECT * FROM LW_DFS_DIT.dbo.##Mytemptable " queryout "' + @OutputFilePath + 
'\OutputData.txt" -T -c -t '''

EXEC(@ExportSQL)

Надеюсь, это поможет

person Abhishek Malviya    schedule 12.08.2020