SQL服务器中的视图参数

时间:2013-05-05 00:21:53

标签: 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 ....

直接访问表并进行连接的动态SQL对我来说不是一个选项,因为第三方约束(这是一个集成,他们希望对我的代码有一个单一的访问点,最好是一个视图 - 而不是比授予访问各种表格的权限)。可以用视图完成吗?我必须使用存储过程吗?这是一个可以通过表值函数解决的问题吗?

3 个答案:

答案 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)

计划图(以三个表为例)

enter image description here

答案 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
)