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の戻り値を取得しています。

ここで私が間違っていることはありますか?

4

2 に答える 2

8

エラーメッセージにあるように、@servernameパラメーターはntextではなくsysnameタイプである必要があります

プロシージャに入るパラメーターを変更できない場合は、プロシージャ内に新しい変数を作成し、変換を行うことを検討してください。

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
于 2012-10-11T00:32:56.173 に答える
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

于 2012-10-11T01:54:02.650 に答える