用于获取链接服务器状态的存储过程

时间:2012-10-11 00:24:31

标签: sql-server tsql stored-procedures linked-server

我试图创建一个存储过程来获取链接服务器的状态,以防止在尝试执行任何操作时出错。我在网上看到了一些例子,但我没有取得任何成功。

这是我的代码:

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的返回值 - 无论链接服务器是否存在。

我在这里做错了什么想法?

2 个答案:

答案 0 :(得分:5)

您的@servername参数必须是sysname类型而不是ntext,因为错误消息显示为

如果您无法更改进入该过程的参数,请考虑在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

答案 1 :(得分: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