SQL Server bcp实用程序不会创建txt文件

时间:2016-02-17 04:00:52

标签: sql-server bcp

我是SQL Server中的新功能,可以使用一些帮助。我正在试验BCP实用程序和AdventureWorks2012数据库。

我正在尝试使用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

5 个答案:

答案 0 :(得分:1)

应该用双引号破坏查询。我在-c之前删除了一个额外的+。 您可以先在命令提示符下测试BCP。在使用xp_cmdshell执行它之前确保它正常工作。

最后,我添加了一个PRINT语句来打印出用于验证的命令

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

答案 1 :(得分: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 '+@@servername+' -T';
EXEC master..xp_cmdshell @sql;

答案 2 :(得分:1)

以下代码段应该在任何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;

答案 3 :(得分:0)

我昨天几乎整个都在努力解决这个问题,最后它出来了,"选择"查询太复杂(可能)直接由xp_cmdshell命令处理。

我有一个查询加入并聚合来自不同数据库的许多表 试图通过xp_cmdshell直接将结果保存到txt文件总是导致BrownEyeBoy提供的输出,eventhought选择本身正常工作。

我只是通过将复杂查询的结果插入临时表中然后在临时表上执行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;

不好,但又简单又有效。

答案 4 :(得分: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