我试图创建一个存储过程来获取链接服务器的状态,以防止在尝试执行任何操作时出错。我在网上看到了一些例子,但我没有取得任何成功。
这是我的代码:
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 :(得分: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 。