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 服务器实例没有权限写入我指定的路径。
应该将查询用双引号引起来。我在 -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
我是 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 服务器实例没有权限写入我指定的路径。
应该将查询用双引号引起来。我在 -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