在一个选择语句中有多个链接服务器,并可能有一个 where 子句



今天遇到了一个棘手的问题(甚至可能只是我(:

我为我的主 SQL 服务器配置了 8 个链接 SQL 2012 服务器,我需要创建表视图,以便我只能使用 one where 子句过滤所有这些组合表结果,目前我使用 UNION,因为它们都具有相同的表结构。

目前我的解决方案如下所示:

SELECT * FROM [LinkedServer_1].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_2].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_3].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_4].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_5].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_6].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_7].[dbo].[Table] where value = 'xxx'
UNION
SELECT * FROM [LinkedServer_8].[dbo].[Table] where value = 'xxx'

如您所见,这变得非常丑陋,因为我有一个 select 语句和每个链接服务器的 where 子句,并且想知道是否有更简单的方法可以做到这一点!

感谢您的反馈。

布拉基101

您可以使用内联表值函数(带有参数的视图(,而不是使用视图。它不会节省创建查询的初始工作,但将来可以节省一些工作:

CREATE FUNCTION [dbo].[fn_LinkedSever] (@value NVARCHAR(128))
AS
RETURNS TABLE
AS
RETURN
(
    SELECT * FROM [LinkedServer_1].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_2].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_3].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_4].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_5].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_6].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_7].[dbo].[Table] where value = @value
    UNION
    SELECT * FROM [LinkedServer_8].[dbo].[Table] where value = @value
);

另外,如果可能,请使用 UNION ALL 而不是 UNION .

相关内容

最新更新