SQL 服务器 bcp 实用程序未创建 txt 文件,

SQL Server bcp utility does not create the txt file,

我是 SQL 服务器中的这个功能的新手,需要一些帮助。我正在试验 BCP 实用程序和 AdventureWorks2012 数据库。

我正在尝试使用 BCP 实用程序将数据导出到文本文件,并且代码已执行但未创建文件。你能看看我的代码并告诉我问题在哪里吗is/are。

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

这是打印输出:

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;

可以在下面的 link 中找到为数据库引擎访问添加系统权限的说明。我必须这样做,因为我的 SQL 服务器实例没有权限写入我指定的路径。

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

应该将查询用双引号引起来。我在 -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

这应该有效

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;

以下代码片段应该 运行 在任何 SQL 服务器上都没有问题。它将 INFORMATION_SCHEMA.TABLES 中的所有 table 信息输出为 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;

我几乎整个昨天都在为这个问题苦苦挣扎,最后它出来了,"select" 查询太复杂(可能)无法直接由 xp_cmdshell 命令处理。

我有一个连接和聚合来自不同数据库的许多 table 的查询。
尝试通过 xp_cmdshell 直接将其结果保存到 txt 文件总是导致 BrownEyeBoy 显示输出,即使 select 本身工作正常。

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

不是很好,但很容易工作。

将完整的 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