Lynn が提案したように、ストアド プロシージャを確認してください。問題はその中にあるようです。
単純な SELECT が機能することを確認します (たとえば、C: ドライブはデータベース サーバーのローカル ドライブであり、必ずしも自分のローカル ドライブである必要はありません)。
最初の 2 つの項目が正常に機能する場合は、次のように 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/クエリアウトにストアドプロシージャを使用するという概念全体が間違っていると思います。