多个链接服务器在一个select语句中有一个where子句,可能吗?

时间:2018-03-15 14:20:38

标签: sql sql-server tsql

今天有一个棘手的问题(甚至可能只是我):

我有8个Linked SQL 2012服务器配置到我的主SQL服务器,我需要创建表视图,这样我只能使用一个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子句,并且想知道是否有更简单的方法来执行此操作!

感谢反馈。

Brakkie101

1 个答案:

答案 0 :(得分:2)

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

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