2017-07-19 72 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