2017-07-19 70 views
0

我有一个SSRS报告中的共享数据集,用于在尝试检索表之前测试链接服务器是否可用。SQL Select基于可用服务器/表

我没有做的是有时他们做一个数据重建(它的部分特定的软件),它会删除所有表,包括一个参考。

所以我得到一个问题,即链接的服务器处于活动状态,但无法找到我之后的表。

我怎样才能让这个查询都测试链接的服务器,看看表是否可用,如果都不是真的运行我的底部的'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 
+0

你的代码看起来很好,你有什么问题?如果服务器无法访问,则会进入cath模块。如果表无法访问,它也可以 – sepupic

+0

我看到的唯一奇怪的事情就是* master *中的* user *表* – sepupic

+0

@sepupic请参阅IF NOT EXISTS的问题,它仍尝试从表所以它不会去CATCH声明。 – Lynchie

回答

0

的错误是:

首先你CHEC ķ表是否存在等在数据库:

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 - 阻塞

但你从master.dbo.ic_brpolicySELECT不但从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 catch 
+0

对我来说还是不错的 - 伙计: - 和上面一样的错误。 – Lynchie

+0

您是否将“主”更改为您感兴趣的数据库? – sepupic

+0

这意味着表格存在,但你没有权限,等一下我会用动态代码更新我的答案。或者你应该使用fn_my_permissions()来检查权限 – sepupic