2016-02-17 3 views
3

Я новичок в этой функции в SQL Server и могу воспользоваться некоторой помощью. Я экспериментирую с утилитой BCP и базой данных AdventureWorks2012.Утилита bcp SQL Server не создает файл txt,

Я пытаюсь экспортировать данные в текстовый файл с помощью утилиты BCP, и код выполняется, но файл не создается. Не могли бы вы посмотреть мой код и рассказать мне, где проблема?

Я работаю над локальной копией SQL Server Express. Спасибо.

Declare @sql Varchar(8000) 

Select @sql = 'bcp 
    + SELECT FirstName, LastName 
    FROM AdventureWorks2012.Person.Person ORDER BY LastName, Firstname 
    + queryout C:\Users\David\Desktop\yes.txt + -c -t, -T -S' 
+ @@SERVERNAME 

EXEC master..xp_cmdshell @sql 

Вот мой выходной, когда я запускаю запрос:

output 
usage: bcp {dbtable | query} {in | out | queryout | format} datafile 
    [-m maxerrors]   [-f formatfile]   [-e errfile] 
    [-F firstrow]    [-L lastrow]    [-b batchsize] 
    [-n native type]   [-c character type]  [-w wide character type] 
    [-N keep non-text native] [-V file format version] [-q quoted identifier] 
    [-C code page specifier] [-t field terminator] [-r row terminator] 
    [-i inputfile]   [-o outfile]    [-a packetsize] 
    [-S server name]   [-U username]   [-P password] 
    [-T trusted connection] [-v version]    [-R regional enable] 
    [-k keep null values]  [-E keep identity values] 
    [-h "load hints"]   [-x generate xml format file] 
    [-d database name]  [-K application intent] [-l login timeout] 
NULL 

Вот выход PRINT:

bcp 
    + "SELECT FirstName, LastName 
    FROM AdventureWorks2012.Person.Person ORDER BY LastName, Firstname" 
    + queryout C:\Users\David\Desktop\yes.txt -c -t, -T -SHOMEPC\SQLINST01 

код TT работал. Вот он:

DECLARE @stmt_e VARCHAR(8000); 
SET @stmt_e= 
    'BCP '+ 
    '"SELECT FirstName,LastName FROM AdventureWorks2012.Person.Person ORDER BY LastName,Firstname" '+ 
    'QUERYOUT "C:\Users\David\Desktop\yes.csv" '+ 
    '-c -t, -T -S ' + @@SERVERNAME; 
EXEC master.sys.xp_cmdshell @stmt_e; 

Инструкции по добавлению системных разрешений для доступа к базе данных доступны по ссылке ниже. Я должен был сделать это, потому что у моего экземпляра SQL Server не было разрешения писать путь, который я указывал.

https://msdn.microsoft.com/en-us/library/jj219062.aspx

+0

добавить «» в ваш запрос на выборку это будет работать .... –

+0

+ символ '' не имеет места в 'bcp' командной строки. Выведите их. –

ответ

0

Следующий фрагмент кода должен работать без проблем на любом SQL Server. Он выводит всю информацию таблицы в INFORMATION_SCHEMA.TABLES в виде файла, разделенного запятой, в C:\Temp\information_schema.csv.

Запустите это как проверку работоспособности; он работает без проблем в моей системе, и он тоже должен быть в вашей системе. Запустите это из базы данных AdventureWorks2012. Если это не сработает, нам нужно углубиться глубже.

DECLARE @stmt_c VARCHAR(8000); 
SET @stmt_c= 
    'BCP '+ 
    '"SELECT*FROM '+QUOTENAME(DB_NAME())+'.INFORMATION_SCHEMA.TABLES" '+ 
    'QUERYOUT "C:\Temp\information_schema.csv" '+ 
    '-c -t, -T -S ' + @@SERVERNAME; 
EXEC master.sys.xp_cmdshell @stmt_c; 

Теперь, если это работает, адаптировать это к вашему запросу:

DECLARE @stmt_e VARCHAR(8000); 
SET @stmt_e= 
    'BCP '+ 
    '"SELECT FirstName,LastName FROM AdventureWorks2012.Person.Person ORDER BY LastName,Firstname" '+ 
    'QUERYOUT "C:\Users\David\Desktop\yes.txt" '+ 
    '-c -t, -T -S ' + @@SERVERNAME; 
EXEC master.sys.xp_cmdshell @stmt_e; 
+0

Спасибо TT. Это работает, но с одним Caveat. Он работает только при указании папки «Temp». У вас есть какое-то понимание того, почему? – BrownEyeBoy

+0

@BrownEyeBoy Поскольку учетная запись пользователя, с которой вы вошли в систему на сервере SQL Server, не имеет надлежащих прав доступа для папки, в которую вы пишете. –

+0

Спасибо TT. Так оно и было. Я предоставил разрешения на запись для своего SQL-экземпляра в параметрах безопасности для каталога, который я пытался сохранить. Для этого использовались следующие инструкции. https://msdn.microsoft.com/en-us/library/jj219062.aspx – BrownEyeBoy

1

Если warpped запрос в двойных кавычках. Я удалил дополнительный + перед -c. Сначала вы можете проверить BCP в командной строке. убедитесь, что он работает перед использованием xp_cmdshell для его выполнения.

И, наконец, я добавил оператор печати распечатать команду для проверки

Declare @sql Varchar(8000) 

Select @sql = 'bcp "SELECT FirstName, LastName ' 
      + 'FROM AdventureWorks2012.Person.Person ' 
      + 'ORDER BY LastName, Firstname" ' 
      + 'queryout C:\Users\David\Desktop\yes.txt -c -t, -T -S' 
      + @@SERVERNAME 

PRINT @sql -- Print out for verification 

EXEC master..xp_cmdshell @sql 
+0

Я ценю попытку, но ваша коррекция не сработала. – BrownEyeBoy

+0

любое сообщение об ошибке? Пожалуйста, опубликуйте его. Aso вы попробовали выполнить BCP в командной строке direclty? Оттуда легче отлаживать – Squirrel

+0

Нет сообщений об ошибках. Работа над публикацией вывода. – BrownEyeBoy

1

Это должно работать

DECLARE @sql VARCHAR(8000); 
SELECT @sql = 'bcp "SELECT FirstName, LastName FROM'+ 
' AdventureWorks2008.Person.Person ORDER BY FirstName, LastName" queryout'+ 
' C:\Users\David\Desktop\yes.txt -c -t, -r \r\n -S '[email protected]@servername+' -T'; 
EXEC master..xp_cmdshell @sql; 
+0

Вы должны проверить вывод, который вы генерируете, например, «Блокнот ++», и перейти в «Вид»> «Показать символ»> «Показать все символы». Вы увидите, что строки заканчиваются на '\ r \ r \ n' (' {CR} {CR} {LF} '). Чтобы иметь правильные разделители строк (для ОС Windows), отпустите '-r \ r \ n'. –

+0

Такая же ситуация, как белка; код не создавал выходной файл. В любом случае спасибо. – BrownEyeBoy

+0

Но он дал другой ответ? Если вы хотите решить эту проблему, вам необходимо предоставить больше отзывов –

0

Я боролся с этой проблемой почти весь вчерашний день и, наконец, выходит, что «выбрать» запрос слишком сложный (возможно), который должен быть обработан командой xp_cmdshell напрямую.

У меня есть запрос, объединяющий и объединяющий множество таблиц из разных баз данных.
Попытка сохранить свои результаты в txt-файле напрямую через xp_cmdshell всегда приводила к выходу, представленному BrownEyeBoy, в результате чего сам выбор работал правильно.

Я обошел это просто вставив результаты сложного запроса во временную таблицу, а затем выполнить xp_cmdshell на временную таблицу, как:

DECLARE 
@SQL varchar(max) 
, @path varchar(max) = 'D:\TMP\TMP_' + convert(varchar(10), convert(date, getdate(), 21)) + '.txt' 
, @BCP varchar(8000) 
; 

INSERT INTO ##TMP 
{COMPLEX SELECT} 
; 

SET @SQL = 'SELECT * FROM ##TMP; 
SET @BCP = 'bcp "' + @sql + '" queryout "' + @path + '" -c -T -S.' 

EXEC xp_cmdshell @bcp; 

Не приятно, но легко и работать.

0

Поместите полный запрос bcp в один, чтобы не менять строку при написании запроса bcp.

Вы можете написать свой запрос как:

Declare @sql Varchar(8000) 

Select @sql = 'bcp "SELECT FirstName, LastName FROM AdventureWorks2012.Person.Person ORDER BY LastName, Firstname " queryout "C:\Users\David\Desktop\yes.txt" -Usa -Ppassw0rd -c -t, -T -S' 

EXEC master..xp_cmdshell @sql