在SQL Server 2005中,我有一个复杂的视图,需要在某些关系上指定其他条件。在创建视图时不知道这些条件。这是一个大大简化的版本。
SELECT fields FROM table1
LEFT JOIN table2 ON ((table1.pid = table2.fid) AND (table2.condition1 = @runtimecondition));
LEFT JOIN table3 ON ....
LEFT JOIN table4 ON ....
LEFT JOIN table5 ON ....
直接访问表并进行连接的动态SQL对我来说不是一个选项,因为第三方约束(这是一个集成,他们希望对我的代码有一个单一的访问点,最好是一个视图 - 而不是比授予访问各种表格的权限)。可以用视图完成吗?我必须使用存储过程吗?这是一个可以通过表值函数解决的问题吗?
答案 0 :(得分:5)
您可以使用内联表值函数
CREATE FUNCTION dbo.Condition
(
@condition1 int,
@condition2 int,
)
RETURNS TABLE
AS
RETURN (
SELECT *
FROM table1 t
LEFT JOIN table2 t2 ON t.pid = t2.fid
AND t2.condition1 = ISNULL(@condition1, t2.condition1)
LEFT JOIN table3 t3 ON t.pid = t3.fid
AND t3.condition1 = ISNULL(@condition2, t3.condition1)
LEFT JOIN table4 ON ....
LEFT JOIN table5 ON ....
)
SQLFiddle上的演示
为了提高性能,请使用以下索引:
CREATE INDEX x ON dbo.table1(pid)
CREATE INDEX x ON dbo.table2(condition1) INCLUDE(fid, pid)
CREATE INDEX x ON dbo.table3(condition1) INCLUDE(fid, pid)
计划图(以三个表为例)
答案 1 :(得分:1)
您可以将感兴趣的字段公开给生产字段列表:
CREATE VIEW myview AS
SELECT fields,
table2.condition1 AS condition1
FROM table1
LEFT JOIN table2 ON (table1.pid = table2.fid);
LEFT JOIN table3 ON ....
LEFT JOIN table4 ON ....
LEFT JOIN table5 ON ....
这允许VIEW
用户在使用您的视图时强加条件,如下所示:
SELECT * FROM myview
WHERE condition1 = @runtimecondition
答案 2 :(得分:0)
这个效率可能低于函数表(但我认为不会这样)。
视图定义为:
SELECT
fields
, table2.fid AS t2fid
, table2.condition1 AS t2condition1
FROM table1
LEFT JOIN table2 ON (table1.pid = table2.fid)
LEFT JOIN table3 ON ....
LEFT JOIN table4 ON ....
LEFT JOIN table5 ON ....
视图调用如:
SELECTT
fields
FROM dbo.MyView
WHERE (
t2fid IS NULL
OR
t2condition1 = @runtimecondition
)