2014-12-02 64 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