2015-09-25 16 views
0

這是我的T-SQL代碼:平等命令寫入兩次 - 一次工作,沒有第二次

;with tmpFolderPermissions(fp_folder, DataItem, fp_modify) as 
(
    select 
     fp_folder, LEFT(fp_modify, CHARINDEX(',',fp_modify+',')-1), 
     STUFF(fp_modify, 1, CHARINDEX(',',fp_modify+','), '') 
    from dbo.tblFolderPermissions 

    union all 

    select 
     fp_folder, CAST (LEFT(fp_modify, CHARINDEX(',', fp_modify+',') -1) AS VARCHAR(200)), 
     STUFF(fp_modify, 1, CHARINDEX(',',fp_modify+','), '') 
    from tmpFolderPermissions 
    where fp_modify > '' 
) 
select fp_folder, DataItem 
from tmpFolderPermissions 

,它工作正常,結果我得到一個表約200行。但是,如果用上面那個完整的代碼我添加與上述相同的命令:

select fp_folder, DataItem 
from tmpFolderPermissions 

所以基本上,如果我連續寫了兩次,第一個命令顯示了我200個結果,這是很好的,但第二個給我這個錯誤:

Invalid object name 'tmpFolderPermissions'.

爲什麼它給我一個錯誤,當它執行一個毫秒前?

回答

2

tmpFolderPermissionsCTE。 CTE不能在多個查詢中重用,因爲它是查詢本身的一部分。所以第二次調用它時,它不存在。 改爲使用臨時表或視圖。從鏈接

報價:

A common table expression (CTE) can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement. A CTE is similar to a derived table in that it is not stored as an object and lasts only for the duration of the query.

+0

注:在這種情況下一個選擇不排除自連接 – jean

0

這是因爲tmpFolderPermissions是CTE,CTE爲某事像tmp目錄表,它不是來自外部訪問的查詢。如果你想重新使用這些數據,你應該將其保存到tmp下表

;with tmpFolderPermissions(fp_folder, DataItem, fp_modify) as 
(
    select 
     fp_folder, LEFT(fp_modify, CHARINDEX(',',fp_modify+',')-1), 
     STUFF(fp_modify, 1, CHARINDEX(',',fp_modify+','), '') 
    from dbo.tblFolderPermissions 

    union all 

    select 
     fp_folder, CAST (LEFT(fp_modify, CHARINDEX(',', fp_modify+',') -1) AS VARCHAR(200)), 
     STUFF(fp_modify, 1, CHARINDEX(',',fp_modify+','), '') 
    from tmpFolderPermissions 
    where fp_modify > '' 
) 
select fp_folder, DataItem into #tmpFolderPermissions 
from tmpFolderPermissions 

,然後#tmpFolderPermissions查詢

相關問題