正如 Lynn 建议的那样,检查您的存储过程。看起来问题就在其中。
确保任何普通的 SELECT 都能正常工作(例如,C: 驱动器是数据库服务器的本地驱动器,不一定是您自己的本地驱动器)。
如果前两项工作正常,则添加 SET FMTONLY OFF,如下所示:
EXEC xp_cmdshell 'bcp "set fmtonly off exec asmary..usp_Contract_SelectByEmpId -1,1" queryout "C:\test.txt" -w -C OEM -t$ -T -r ~ -S heba\HEBADREAMNET'
我不得不承认,当我在我的计算机上尝试类似的操作时,它因“功能序列错误”而失败,我发现它与 2011 年修复的 SQL Server 2008 错误有关。
另请注意,即使没有 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 的整个概念是错误的。