2014-12-02 67 views
0

當我收到以下錯誤在SQL Server 2012:錯誤使用插入CTE

無效的對象名稱庫「。

有沒有辦法修改語法,所以我不必使用表變量?問題出現在代碼的最後,我把它放在聲明中。

下面是代碼:

SET NOCOUNT ON 
declare @level int = 0 

DECLARE @DataLibraryName VARCHAR(500) 
SET @DataLibraryName = 'FN_PerfSalesChargeFeeReplacementText'; 

IF LTRIM(RTRIM(@DataLibraryName)) = '' 
    SET @DataLibraryName = null; 

WITH DataLibraryRaw AS 
( 
    SELECT 
     * 
     ,CAST(CAST(dataLibraryXML AS NTEXT) AS XML) dataLibraryXMLData 
     ,datasource_name dataLibraryName 
    FROM 
     tblrpt_datascript 
    --WHERE datasource_type = 'DLMERGE' 
), 
DataLibraryDep AS 
( 
    SELECT 
     dataLibraryName 
     ,dataLibraryXMLData.query('//SourceSpecification') [SourceSpecification] 
    FROM 
     DataLibraryRaw 
), 
DependenciesXML AS 
( 
    SELECT 
     dataLibraryName 
     ,CAST(REPLACE(REPLACE(CAST([SourceSpecification] AS NVARCHAR(MAX)), '#', '<item>#'), '}', '}</item>') AS XML) AS dataLibraryXMLData 
    FROM 
     DataLibraryDep 
), 
DataLibraries AS 
( 
    SELECT 
     dataLibraryName 
     ,d.i.query('.').value('.', 'nvarchar(max)') dependDataLibrary 
    FROM 
     DependenciesXML dx 
    CROSS APPLY 
     dataLibraryXMLData.nodes('//item') AS d(i) 
), 
Libraries AS 
( 
    SELECT 
     dataLibraryName parentDL 
     ,LTRIM(RTRIM(SUBSTRING([dependDataLibrary], CHARINDEX('=', [dependDataLibrary] ,1)+1 ,CHARINDEX('{', [dependDataLibrary], 1)-(CHARINDEX('=', [dependDataLibrary] ,1)+1)))) childDL 
    FROM 
     DataLibraries 
), 
RecursiveData AS 
( 
    SELECT 
     *, 0 AS LEVEL 
    FROM 
     Libraries 
    WHERE 
     parentDL = IsNull(@DataLibraryName, parentDL) 
) 
SELECT * 
FROM RecursiveData 

---- Recursive member definition 

insert RecursiveData 
    SELECT 
     m.parentDL, m.childDL, 
     @level + 1 
    FROM 
     Libraries m 
    INNER JOIN 
     RecursiveData r ON r.childDL = m.parentDL AND r.level = @level 

預先感謝您。

+1

所有這些CTE(包括'Libraries')只對**一個,單個下一個語句**('SELECT * FROM RecursiveData')有效 - 您不能在後面的 – 2014-12-03 06:08:58

回答

0

基於上述腳本,問題是,你從你的CTE做一個選擇:

SELECT * FROM RecursiveData

然後做您的插入:

insert RecursiveData 
SELECT m.parentDL, m.childDL, 
@level + 1 
FROM Libraries m 
INNER JOIN RecursiveData r 
ON r.childDL = m.parentDL and r.level = @level 

不能引用CTE在使用它的語句之後,所以只要SELECT *聲明在那裏,插入就會失敗。然而,另一個問題是,你似乎試圖插入到你最後一次CTE,RecursiveData中,這也不會像你期望的那樣工作。

它看起來像的代碼的最後一節之前,您插入應該是:

,RecursiveData AS (
    SELECT ParentDL, ChildDL, 0 AS LEVEL 
    FROM Libraries 
    WHERE parentDL = IsNull(@DataLibraryName, parentDL) 
    UNION ALL 
    SELECT l.PARENTDL, l.CHILDDL, r.LEVEL + 1 
    FROM Libraries l 
    JOIN RecursiveData r ON r.CHILDDL = l.PARENTDL 
    ) 
    SELECT * FROM RecursiveData 

而且你要離開插入完全關閉(或將其插入到你需要的任何表)。

+0

上引用CTE所以我實際上需要插入因爲它會添加第二個遞歸級別。是否可以給定當前的代碼格式? – user3746034 2014-12-03 14:23:44

+0

上面給出的示例應該可以幫助您構建遞歸級別。這是如何建立一個遞歸CTE。您可以在這裏獲得更全面的解釋:http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx – 2014-12-04 05:10:38