2013-02-08 68 views
2

添加說明:我的代碼在存儲過程中運行。SELECT INTO #temp .. FROM [Query1]或[Query2]

多年來,我已經多次遇到這個問題,所以認爲我會咬緊牙關,最後問,即使我想我可能會錯過一個簡單的解決方案。

時常是我喜歡使用

SELECT * INTO #Temp FROM ... 

的情況。因爲我找到關於小數據集使用時,它通常執行比臨時表產生的任何其他手段更好。

但是有時我會有一個參數化的查詢,它可以運行在多個「模式」下,因此需要我的語句能夠根據這個模式從兩個完全不同的源填充#Temp,例如。

選項1

IF @RoleID > -1 
    SELECT PrivilegeID INTO dbo.#Privs FROM Users.tblRolePrivilegeLink WHERE RoleID = @RoleID 

選項2

IF @UserID > -1 
     SELECT PrivilegeID INTO dbo.#Privs FROM dbo.fn_UserPrivileges(@UserID) 

在這個例子中,我試圖讓一組特權爲任何一個角色或用戶,從表中一條直線,另一從一個函數。

我知道我可以使用常規的INSERT INTO ..邏輯,但我真的很感興趣,看看是否有這樣做的實際解決方案。也許與CTE或其他。

解決方案

-- Get distinct privileges 
SELECT PrivilegeID 
INTO dbo.#Privs 
FROM 
(
     SELECT PrivilegeID FROM Users.tblRolePrivilegeLink WHERE RoleID > -1 AND RoleID = @RoleID 
     UNION 
     SELECT PrivilegeID FROM dbo.fn_UserPrivileges(@UserID) WHERE @UserID > -1 
) AS T 

回答

2
SELECT * 
INTO dbo.#Privs 
from (
    SELECT PrivilegeID 
    FROM Users.tblRolePrivilegeLink 
    WHERE RoleID = @RoleID and @RoleID > -1 

    UNION 

    SELECT PrivilegeID 
    FROM dbo.fn_UserPrivileges(@UserID) 
    WHERE @UserID > 1) 
+0

如果您嘗試編譯它會出錯,它不會讓您選擇兩次同一個表。 – 2013-02-08 15:44:19

+0

編輯,與子查詢使用'into' – paul 2013-02-08 15:46:17

+0

是的,工作,謝謝。實際上似乎很簡單,一棵樹就不能見樹木。 :) – 2013-02-08 15:48:44

2

你可以做thisby通過 「走出去」 分離staetments:

if 1=0 select 1 as v into #temp; 
go 
if 1=1 select 2 as v into #temp; 
go 
select * from #temp 

此代碼假定#temp最初並不存在。

+0

我不認爲你可以在存儲過程中使用GO。 – 2013-02-08 15:45:27

+0

@JanineRawnsley。 。 。你不能。我沒有把這看作是問題的一個要求。 – 2013-02-08 15:46:20

+0

對不起,有時我忘了不是每個人都使用SPs ;-) – 2013-02-08 15:49:13