簡體   English   中英

使用BCP導出SQL Server 2008中的存儲過程結果

[英]using BCP to export stored procedure result in SQL Server 2008

Heyy,

我正在嘗試使用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 '

此查詢的輸出告訴此錯誤:

錯誤= [Microsoft] [SQL Server Native Client 10.0] [SQL Server]關鍵字“where”附近的語法不正確。

甚至以為我確定存儲過程“usp_Contract_SelectByEmpId”正常工作。

以前有人遇到過那種錯誤嗎?

  1. 正如Lynn建議的那樣,檢查你的存儲過程。 看起來問題就在於此。

  2. 確保任何普通的SELECT工作(例如,C:驅動器是數據庫服務器的本地驅動器,不一定是您自己的本地驅動器)。

  3. 如果前兩項工作正常,則按如下方式添加SET FMTONLY OFF:

EXEC xp_cmdshell'bcp“設置fmtonly off exec asmary..usp_Contract_SelectByEmpId -1,1”queryout“C:\\ test.txt”-w -C OEM -t $ -T -r~ -Sheba \\ 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的整個概念是錯誤的。

嘗試這個。

DECLARE @strbcpcmd NVARCHAR(max)
SET @strbcpcmd = 'bcp  "EXEC asmary..usp_Contract_SelectByEmpId -1,1" queryout "C:\test.txt" -w -C OEM -t"$" -T -S'+@@servername    
EXEC master..xp_cmdshell @strbcpcmd

很抱歉用多個答案充斥你的問題,但我想知道存儲過程的使用與普通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錯誤。

注意請小心創建動態查詢並轉義所有顯式文字字符串(即重復所有單引號兩次),以避免臭名昭着的SQL注入。 不幸的是,還有另一個陷阱:你應該確保你沒有兩次或多次逃避查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM