SQL服务器中的视图参数

sco*_*tru 1 sql sql-server

在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直接访问表并进行连接对我来说不是一个选项(这是一个集成,他们希望对我的代码具有单一访问点,最好是视图 - 而不是授予访问权限到各种表).可以用视图完成吗?我必须使用存储过程吗?这是一个可以通过表值函数解决的问题吗?

Ale*_*nko 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 ....
        )
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)

计划图(三个表的示例)

在此输入图像描述