【发布时间】:2017-07-18 08:23:30
【问题描述】:
在我的查询中,我必须从不受我控制的 db 中加入表。这让我发疯,因为有时无法访问此数据库(请不要问我为什么),这会破坏我的查询。我要加入的字段对我的运营来说不是基本的,我希望我的应用能够正常工作,即使这些字段一次无法访问。
这是我不拥有的数据结构:
[DBOutOfControl].[dbo].[Table1]:
[Field1]
[Field2]
[DBOutOfControl].[dbo].[Table2]:
[Field1]
[Field2]
[Field3]
这是我的桌子:
[DBInMyControl].[dbo].[Table3]:
[Field1]
我的原始查询看起来像这样:
SELECT [Table3].[MyID],
[ForeignDataQry].[A],
[ForeignDataQry].[B]
FROM [DBInMyControl].[dbo].[Table3]
LEFT JOIN
(SELECT [Table1].[Field1] AS [MyID],
[Table1].[Field2] AS [A],
[SubQry].[Field2] AS [B]
FROM [DBOutOfControl].[dbo].[Table1]
LEFT JOIN
(SELECT [Table2].[Field1],
[Table2].[Field2]
FROM [DBOutOfControl].[dbo].[Table2]
WHERE [Table2].[Field3] = 'Where') AS [SubQry] ON [Table1].[Field1] = [SubQry].[Field1]) AS [ForeignDataQry] ON [Table3].[MyID]=[ForeignDataQry].[MyID]
我怎样才能对这个查询进行防弹,所以当 [ForeignDataQry] 生成错误时,结果将是:
[MyID] [A] [B]
1 NULL NULL
否则
[MyID] [A] [B]
1 Va1 Val2
有什么可以在服务器端做的吗?
【问题讨论】:
-
当另一个数据库无法访问时,您的代码无法编译,因此您唯一能做的就是尝试在另一个(内部)上下文中执行它,将其包装在动态 sql 中,如果它成功什么都不做,如果没有,外部的 try..catch 会捕获它,然后你执行另一个代码而不引用不可访问的对象
标签: sql-server try-catch