2012-07-24 60 views
2

選擇我有一個返回同一列中的兩個觀點,但不同的行。存儲過程,並從兩個幾乎相同的觀點

我創建一個使用這些視圖的存儲過程。存儲過程很大,並在列之間搜索匹配的行。現在

,我的願望是這樣的:如果我收到了一下參數值爲0,那麼我應該從一個視圖獲取信息,如果該參數爲1,那麼我應該從另一種觀點的信息。

我已經認識到動態SQL是一個壞主意,和存儲過程我跟工作已經相當複雜。重新創建它是動態的不是一種選擇。

我也讀到它是不可能做到這一點:

select * from @table 

因爲表的名字應該是靜態的,並且在給前沒有通過。一個由代碼存儲的過程。

我試圖做到的是這樣的:

SELECT TOP(@top) subtaskid,activityid FROM 
(CASE WHEN @allProjects=1 THEN view_project_all ELSE view_project_mine) v 

但是我得到錯誤信息,說「不正確的語法附近關鍵字‘案例’我意識到這個問題是密切相關的動態sql,和。可變視圖\表問題遍佈整個stackoverflow,但我認爲,因爲我的兩個表實際上是在存儲過程中,這是更多的功能比黑客...

問題是這樣的:有沒有一種方法來設置靜態變量,所以這一個選擇可以根據參數給出不同的意見?

+0

你爲什麼不希望重複的代碼是什麼?這是問題嗎?動態sql是另一種方法。還有爲什麼要在SP中使用視圖,爲什麼不直接使用底層表,並且通過對這些視圖進行處理,似乎這些表訪問的是除了篩選礦vs所有表之外的其他表。您可以展開查詢,然後在單個語句中進行並進行適當的過濾。你能發佈視圖定義嗎? – 2012-07-24 08:16:39

+0

對於不想重複代碼的明顯的原因是重構,並保持我們的代碼庫儘可能小。如果我們稍後要在這個程序中改變某些東西,我們將不得不在多個地方進行,這是一個耗時且昂貴的事情。 :)使用不同視圖的原因是我們的數據庫中的表格很大,並且有很多不需要的信息,直接進入表格意味着我不得不編寫大量邏輯來獲取這些信息。正確的順序。自從我在一家公司工作以來,視圖定義不可能發佈。對不起:) – 2012-07-24 08:20:13

+0

它可能在小型解決方案中始終直接進入表格,並將所有邏輯放入sp中,但這些視圖用於代碼中,而不僅用於SP中。直接使用表格也是調整程序行爲的一個弱點。顧問可以改變觀點,並以不同於往常的方式工作,這是值得的。直接編程到表格通常不是一個好主意,只需要在兩個地方更改代碼,然後快速複製到更多,然後就可以了...總體而言,我完全不同意你的邏輯:) – 2012-07-24 09:03:46

回答

3

最簡單的方法:

IF @allProjects = 1 
BEGIN 
    SELECT TOP(@top) subtaskid,activityid FROM view_project_all v; 
END 
ELSE 
    SELECT TOP(@top) subtaskid,activityid FROM view_project_mine v; 
BEGIN 
END 

如果你願意,你可以創建一個視圖,工會這些表,然後做你的查詢反對這種觀點:

SELECT subtaskid, activityid, 1 as allProjects FROM view_project_all 
UNION ALL 
SELECT subtaskid, activityid, 0 as allProjects FROM view_project_mine 

查詢反對:

SELECT TOP(@top) subtaskid,activityid FROM view_project_mine_all_union v WHERE allProjects = @allProjects; 
+0

這正是我試圖避免... :)我不想重複的代碼... – 2012-07-24 07:55:34

+0

查看編輯,創建一個新視圖與兩個視圖和disciminator(allProjects)的聯合。 – 2012-07-24 07:56:30

+0

這也行不通,這是因爲兩個分離視圖中的值應該是分開的。如果他們不是,我不會需要兩個視圖:) – 2012-07-24 07:56:54

2

您可以使用if if

if @allProjects = 1 
     SELECT subtaskid,activityid FROM view_all_projects 
else 
     SELECT subtaskid,activityid FROM view_project_mine 

如果這是你的問題過於簡單化,那麼你可以把結果放到一個臨時表。

或者你可以優化項目視圖,以便它包括項目業主,並嘗試

SELECT subtaskid, activityId FROM view_projects 
WHERE (projectowner = USER) OR (@allprojects=1) 
0

你可以把一個簡單的if else循環

If @allProjects = 1 
begin 
SELECT TOP(@top) subtaskid,activityid from view_project_all 
end 
else 
begin 
SELECT TOP(@top) subtaskid,activityid from view_project_mine 
end 
相關問題