在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 ....
Run Code Online (Sandbox Code Playgroud)
由于第三方约束,动态SQL直接访问表并进行连接对我来说不是一个选项(这是一个集成,他们希望对我的代码具有单一访问点,最好是视图 - 而不是授予访问权限到各种表).可以用视图完成吗?我必须使用存储过程吗?这是一个可以通过表值函数解决的问题吗?
您可以使用内联表值函数
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 ....
)
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
计划图(三个表的示例)

| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |