2013-05-05 35 views
1

在SQL Server 2005中,我有一個複雜的視圖,需要指定特定關係的附加條件。這些條件在創建視圖時是未知的。這是一個非常簡化的版本。用於在SQL服務器中查看的參數

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

你必須使用的東西比視圖更強大,比如TVF。視圖不能被參數化。 – 2013-05-08 13:47:42

回答

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

可以公開感興趣的領域(縣)生產的字段列表:

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 
+1

但在這種情況下,查詢的語義將會不同。http://sqlfiddle.com/#!3/d9824/2 – 2013-05-05 06:29:31

+0

是的 - 這正是我遇到的問題。查詢似乎在邏輯上並不相同 - 我得到不同的結果集。 – scotru 2013-05-12 21:38:33

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 
)