2012-06-19 67 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注入。不幸的是,還有另一個缺陷:你應該確保你不會兩次或更多次地逃避你的查詢。

相關問題