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 参数必须是类型 sysname 而不是 ntext 如错误消息所述

如果您无法更改进入过程的参数,请考虑在过程中创建一个新变量并进行转换:

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 回答