2009-07-28 29 views
2

的結果我有一個現有的SQL 2005的存儲過程,由於某種原因,輸出在SSMS代替結果窗格中的消息窗格中的結果。 (它實際上是一個已經編譯並部署到我們所有服務器的CLR程序,並且用於另一個日常程序,所以我不能改變它,我只是想使用它的輸出)。一個存儲過程,其行爲以同樣的方式:使用SQL「消息」窗格

CREATE PROCEDURE [dbo].[OutputTest] 
    @Param1 int, @Param2 varchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    PRINT 'C,10000,15000'; 
    PRINT 'D,30000,90000'; 
    PRINT 'E,500,50000'; 
END 

所以沒有實際選擇聲明在那裏,如果你運行它,你會看到只有在信息窗格中的所有結果。

有沒有什麼辦法讓我使用這些結果作爲更大查詢的一部分?把他們放在一個臨時表或其他東西,所以我可以解析出來?

無的「正常的東西」的作品,因爲沒有真正的「輸出」在這裏:

INSERT INTO #output 
EXEC OutputTest 100, 'bob' 

只是表明

C,10000,15000 
D,30000,90000 
E,500,50000 

(0 row(s) affected) 
上的消息窗格

,並臨時表沒有按」實際上可以得到任何東西。

回答

1

您不能捕獲,捕獲或從SQL Server中使用這些信息。但是,您可以從客戶端應用程序中接收它們。

1

我不認爲有一種方法,但即使有我認爲你應該認真考慮它是否是一個好主意。這聽起來像是一個軟糖,它只會導致你長期的痛苦。創建一個完全符合你的想法的替代過程聽起來像是一個更好的計劃。

+0

也許是正確的,但是如果它*可能,這個技術還有其他應用,比如在調整查詢時解析出現在消息窗格上的「SET STATISTICS IO ON」的結果。 – BradC 2009-07-28 16:57:25

+0

這是一個有趣的觀點,但我認爲解析是由客戶端應用程序完成的,而不是由sql服務器完成的。是否有可能無法掌握CLR過程,解決問題並向服務器發佈第二個版本,以便不影響該過程的現有消費者? – 2009-07-28 17:14:21

1

無法從結果中的消息窗格中獲取消息。 如果你仔細想想,SSMS只是一個以你看到的方式解析這些消息的客戶端。

,如果你婉使用它們在你的應用程序來看看Connection Events in ADO.NET

1

我能想到的是,如果輸出通過RAISERROR命令打印,這可能是可能是唯一的出路。在這種情況下,您可以使用TRY/CATCH將其捕獲到其他地方。

但這只是一個想法:我從來沒有這樣做過。實際上,我們做的遠程關閉的唯一事情是我們有一個命令行工具來運行批處理作業中的存儲過程,而不是使用sql server代理來安排它們。這樣,我們所有的夜間工作都安排在一個地方(Windows任務計劃程序)而不是兩個,命令行工具將打印到消息窗口的任何內容捕獲到我們監視的通用日誌記錄系統中。所以一些程序會輸出相當多的細節到那個窗口。

6

你能從C#代碼執行存儲過程嗎?如果是的話,你也許可以掛接到名爲SqlInfoMessage的SqlCommand的事件:

SqlConnection _con = new SqlConnection("server=.; 
      database=Northwind;integrated Security=SSPI;"); 

_con.InfoMessage += new SqlInfoMessageEventHandler(_con_InfoMessage); 

事件處理程序看起來像這樣:

static void _con_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    string myMsg = e.Message;    
} 

的「e.Message」是打印出來的消息SQL Server Mgmt Studio中的消息窗口。

雖然它不會很漂亮,並且可能需要一些難看的解析代碼,但至少您可以通過這種方式獲得這些消息,我希望!

馬克