Sql server SQL Server bcp实用程序不创建txt文件,

Sql server SQL Server bcp实用程序不创建txt文件,,sql-server,bcp,Sql Server,Bcp,我不熟悉SQL Server中的此功能,需要一些帮助。我正在试验BCP实用程序和AdventureWorks2012数据库 我试图用BCP实用程序将数据导出到文本文件,代码执行,但没有创建文件。你能看一下我的代码并告诉我问题出在哪里吗 我正在使用SQL Server Express的本地副本。多谢各位 Declare @sql Varchar(8000) Select @sql = 'bcp + SELECT FirstName, LastName FROM Adventure

我不熟悉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
以下是打印输出:

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实例没有权限写入我指定的路径


应将查询扭曲为双引号。我在-c之前删除了一个额外的+。 您可以先在命令提示符下测试BCP。在使用xp\u 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 Server上都可以正常运行。它将
information\u SCHEMA.TABLES
中的所有表信息作为逗号分隔文件输出到
C:\Temp\information\u 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\u cmdshell
命令直接处理

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

通过将复杂查询的结果插入临时表,然后在临时表上执行
xp\u 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

在select查询中添加一个“”这将起作用。
+
符号在
bcp
命令行中没有位置。把它们拿出来。你应该检查你在例如记事本++中生成的输出,然后进入查看>显示符号>显示所有字符。您将看到行以
\r\r\n
{CR}{CR}{LF}
)结尾。要使用正确的行分隔符(对于Windows操作系统),请删除
-r\r\n
。与Squirrel的情况相同;代码没有创建输出文件。无论如何,谢谢。但它给出了不同的回答,对吗?如果你想解决这个问题,你需要提供更多的反馈。我很感激你的尝试,但是你的更正没有起作用。有错误消息吗?请把它寄出去。Aso您是否尝试在命令提示符下直接执行BCP?从那里调试更容易命令提示符中的输出与我在SQL Server中运行代码时的输出相同。我发布了上面的示例。您是否可以使用更新的代码打印@sql并发布结果,并授予正确的权限?这同样有效。谢谢松鼠,谢谢你。这确实有效,但有一点需要注意。它只在我指定“Temp”文件夹时起作用。您是否了解原因?@BrownEyeBoy,因为您在SQL Server中登录的用户帐户对您正在写入的文件夹没有正确的访问权限。谢谢。成功了。我在试图保存到的目录的安全选项中为我的SQL实例授予了写权限。使用以下说明执行此操作。