Sql server 使用insert CTE时出错

Sql server 使用insert CTE时出错,sql-server,Sql Server,我在SQL Server 2012中收到以下错误: 无效的对象名称“库” 有没有办法修改语法,使我不必使用表变量?问题出现在代码末尾,我将into语句放在那里 代码如下: SET NOCOUNT ON declare @level int = 0 DECLARE @DataLibraryName VARCHAR(500) SET @DataLibraryName = 'FN_PerfSalesChargeFeeReplacementText'; IF LTRIM(RTRIM(@DataL

我在SQL Server 2012中收到以下错误:

无效的对象名称“库”

有没有办法修改语法,使我不必使用表变量?问题出现在代码末尾,我将into语句放在那里

代码如下:

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

先谢谢你

根据上面的脚本,问题在于您正在从CTE中选择:

从递归数据中选择*

然后进行插入:

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的语句之后引用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 

您可能希望完全不使用insert,或者将其插入到您需要的任何表中。

所有这些CTE包含的库仅对一个next语句SELECT*FROM RecursiveData有效-您以后不能引用CTE,因此我实际上需要insert,因为它将添加第二个递归级别。在给定当前代码的情况下,是否可以格式化?我上面给出的示例应该可以帮助您构建递归级别。这是如何构建递归CTE。你可以在这里得到更详细的解释: