我有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
答案 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
。