2012-10-11 79 views
2

我試圖創建一個存儲過程來獲取鏈接服務器的狀態,以防止在嘗試執行任何操作時發生錯誤。我在網上看到了一些例子,但我沒有取得任何成功。獲取鏈接服務器狀態的存儲過程

這裏是我的代碼:

ALTER PROCEDURE [dbo].[checkLinkedServer] 
    @servername ntext 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @retval int = 0; 
    BEGIN TRY 
     EXEC @retval = sys.sp_testlinkedserver @servername; 
     SELECT 1; 
    END TRY 
    BEGIN CATCH 
     SELECT 0; 
    END CATCH;  
END 

我總是得到的返回值爲0 - 如果鏈接的服務器存在與否沒有關係。

任何想法我在做什麼錯在這裏?

+0

你試過沒有開始嘗試,等運行呢? – ChrisBint

+0

@ChrisBint顯示此消息:消息214,級別16,狀態90,過程sp_testlinkedserver,第1行過程期望類型爲'sysname'的參數'@servername'。 – Rafael

+2

爲什麼你的參數'ntext'?你知道這種類型很久以前就被棄用了,對吧?你嘗試過'sysname'(因爲已經提示錯誤信息!)或'nvarchar(128)'? –

回答

5

你@servername參數需要不NTEXT的錯誤消息sysname類型的說

如果你不能改變參數進入程序再考慮創建proc中有一個新的變量,並做了轉換:

ALTER PROCEDURE [dbo].[checkLinkedServer] 
    @servername ntext 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @retval int = 0, 
      @sysservername sysname; 
    BEGIN TRY 
     SELECT @sysservername = CONVERT(sysname, @servername); 
     EXEC @retval = sys.sp_testlinkedserver @sysservername; 
     SELECT 1; 
    END TRY 
    BEGIN CATCH 
     SELECT 0; 
    END CATCH;  
END 
2

不幸的是,sp_testlinkedserver文檔和執行不一致,並且一直如此以來,程序是在SQL Server 2005中添加BOL說失敗返回1的過程。

僅供參考,您可以檢查:http://connect.microsoft.com/SQLServer/feedback/details/522821/sp-testlinkedserver-fails-catastrophically-when-linked-server-is-offline

+0

「我們已經在團隊成員中討論過這一點,並得出結論認爲,在這一點上最好的做法是修復BOL以符合現實。」 。我想知道究竟是什麼意思...... – Rafael

+0

BOL意味着在線書籍,上述聲明意味着團隊希望修復在線書籍和文檔。 –

+0

感謝您的幫助:D – Rafael

相關問題