Sql server SQL Server bcp实用程序不创建txt文件,
我不熟悉SQL Server中的此功能,需要一些帮助。我正在试验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
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实例授予了写权限。使用以下说明执行此操作。