2012-06-19 42 views
1

Heyy,使用BCP导出存储过程结果在SQL Server 2008

我试图使用BCP使用该查询SP结果导出到文本文件:

EXEC xp_cmdshell 'bcp "exec asmary..usp_Contract_SelectByEmpId -1,1" queryout "C:\test.txt" -w -C OEM -t$ -T -r ~ -S heba\HEBADREAMNET ' 

的输出此查询告诉这个错误:

Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Incorrect syntax near the keyword 'where'.

甚至以为我敢肯定的是,存储过程“usp_Contract_SelectByEmpId”工作正常。

以前有人遇到过这种错误吗?

回答

0

试试这个。

DECLARE @strbcpcmd NVARCHAR(max) 
SET @strbcpcmd = 'bcp "EXEC asmary..usp_Contract_SelectByEmpId -1,1" queryout "C:\test.txt" -w -C OEM -t"$" -T -S'[email protected]@servername  
EXEC master..xp_cmdshell @strbcpcmd 
3
  1. 在Lynn建议,请检查您的存储过程。看起来问题在于此。确保任何普通的SELECT工作(例如,C:驱动器是数据库服务器的本地驱动器,不一定是您自己的本地驱动器)。

  2. 如果前两个项目做工精细,再加入SET FMTONLY OFF如下:

EXEC的xp_cmdshell“BCP “FMTONLY掀起高管asmary..usp_Contract_SelectByEmpId -1,1” queryout“C: \ test.txt“-w -C OEM -t $ -T -r〜-S heba \ HEBADREAMNET'

我不得不承认,当我在我的计算机上尝试类似时,它失败了'Function sequence error',并且我发现它与2011年修复的SQL Server 2008 bug有关。

请注意al所以即使没有SET FMTONLY OFF,也可以使用BCP库(odbcbcp.dll/odbcbcp.lib)。因此,如果您编写自己的包装可执行文件(例如C或C++),则可以拥有更通用的ODBC范围的bcp解决方案。

我还发现在http://msdn.microsoft.com/en-us/library/ms162802.aspx

查询以下只要之前执行BCP语句存在的存储过程中引用的所有表可以引用存储过程。例如,如果存储过程生成临时表,则bcp语句将失败,因为临时表仅在运行时可用,而不在语句执行时可用。在这种情况下,请考虑将存储过程的结果插入表中,然后使用bcp将表中的数据复制到数据文件中。

请参阅我以后的单独回复 - 我认为使用BCP/queryout存储过程的整个概念是错误的。

0

对不起,您的问题泛滥,但我想知道存储过程的使用与普通的SELECT相比有多重(性能)。我从

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/b8340289-7d7e-4a8d-b570-bec7a0d73ead/

这迫使我创建另一个(独立)的答案有一个非常重要的信息。我提到的帖子使整个概念无效。

简而言之:存储过程可能被调用几次(3次),以便找出结果集的结构,然后是实际数据。因此(特别是如果从SQL Server连接而不是客户端调用),我认为使存储过程或函数更有意义,它将返回SELECT语句。然后你可以使用另一个通用存储过程或函数来创建并执行嵌入了该语句的完整BCP命令。我非常肯定,在这种情况下,BCP可能会使用更好的执行计划。不幸的是,由于我在之前的文章中提到的SQL Server 2008 R2中的BCP错误,我无法验证实际情况。

N.B.请小心创建动态查询并转义所有明确的文字字符串(即重复所有单引号两次)以避免臭名昭着的SQL注入。不幸的是,还有另一个缺陷:你应该确保你不会两次或更多次地逃避你的查询。

相关问题