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