1

在 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 ....

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

4

3 回答 3

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)

平面图(以三张表为例)

在此处输入图像描述

于 2013-05-05T06:53:07.450 回答
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
于 2013-05-05T00:28:38.760 回答
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
)
于 2013-05-08T13:44:24.617 回答