首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于可用服务器/表的SQL选择

基于可用服务器/表的SQL选择
EN

Stack Overflow用户
提问于 2017-07-19 08:29:46
回答 1查看 45关注 0票数 0

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

我没有考虑到的是,有时他们会进行数据重建(它是特定于部门的软件的一部分),删除所有的表,包括引用的表。

因此,我遇到了一个问题,即链接服务器是活动的,但它找不到我想要的表。

如何让这个查询既测试链接的服务器,又查看表是否可用,如果两者都不是真的话,请运行底部的“Catch”语句。

我需要测试的表是

FIRST-W2K12-SQL.HQ.FIRST.CO.UK.First_ICP.dbo.ic_brpolicy

代码语言:javascript
复制
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

我试过这样做

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-07-19 10:42:06

这里的错误是:

首先,在数据库中检查表的存在情况:

代码语言:javascript
复制
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数据库中,如下所示:

代码语言:javascript
复制
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

要捕获编译错误,可以使用如下动态代码:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45185031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档