我在SSRS报告中有一个共享数据集,在尝试检索表之前测试链接服务器是否可用。
我没有考虑到的是,有时他们会进行数据重建(它是特定于部门的软件的一部分),删除所有的表,包括引用的表。
因此,我遇到了一个问题,即链接服务器是活动的,但它找不到我想要的表。
如何让这个查询既测试链接的服务器,又查看表是否可用,如果两者都不是真的话,请运行底部的“Catch”语句。
我需要测试的表是
FIRST-W2K12-SQL.HQ.FIRST.CO.UK.First_ICP.dbo.ic_brpolicy
BEGIN TRY
exec sp_testlinkedserver [FIRST-W2K12-SQL.HQ.FIRST.CO.UK];
SELECT DISTINCT [Brand] FROM InfoCentre.dbo.ic_brpolicy
WHERE Brand IS NOT NULL
UNION ALL
SELECT DISTINCT [Brand] FROM [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].First_ICP.dbo.ic_brpolicy
WHERE Brand IS NOT NULL
END TRY
BEGIN CATCH
SELECT 'Error Retrieving Bracknell Brands'
UNION
SELECT DISTINCT [Brand] FROM InfoCentre.dbo.ic_brpolicy
WHERE Brand IS NOT NULL
END CATCH我试过这样做
BEGIN TRY
exec sp_testlinkedserver [FIRST-W2K12-SQL.HQ.FIRST.CO.UK];
IF NOT EXISTS (SELECT * FROM [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].master.INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'ic_brpolicy')
BEGIN
RAISERROR('Table Doesnt Exist',16,1)
END
IF NOT EXISTS (SELECT * FROM [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].master.INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'icp_brpolicy')
BEGIN
RAISERROR('Table Doesnt Exist',16,1)
END
SELECT DISTINCT [Brand] FROM InfoCentre.dbo.ic_brpolicy
WHERE Brand IS NOT NULL
UNION ALL
SELECT DISTINCT [Brand] FROM [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].First_ICP.dbo.ic_brpolicy
WHERE Brand IS NOT NULL
END TRY
BEGIN CATCH
SELECT 'Error Retrieving Bracknell Brands'
UNION
SELECT DISTINCT [Brand] FROM InfoCentre.dbo.ic_brpolicy
WHERE Brand IS NOT NULL
END CATCH发布于 2017-07-19 10:42:06
这里的错误是:
首先,在主数据库中检查表的存在情况:
IF NOT EXISTS (SELECT * FROM [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].master.INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'ic_brpolicy')
BEGIN
RAISERROR('Table Doesnt Exist',16,1)
END但是该表存在于母版中,因此您没有错误,也不会转到catch-block。
但是,您做的SELECT不是来自master.dbo.ic_brpolicy,而是来自First_ICP.dbo.ic_brpolicy,并且表不存在,或者您没有对它的权限。
应该检查是否存在于First_ICP数据库中,如下所示:
IF NOT EXISTS (SELECT * FROM [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].First_ICP.INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'ic_brpolicy')
BEGIN
RAISERROR('Table Doesnt Exist',16,1)
END要捕获编译错误,可以使用如下动态代码:
begin try
exec('select top 1 * from InfoCentre.dbo.ic_brpolicy');
exec('select top 1 * from [FIRST-W2K12-SQL.HQ.FIRST.CO.UK].First_ICP.dbo.ic_brpolicy');
begin catch
select error_message();
end catchhttps://stackoverflow.com/questions/45185031
复制相似问题