Sql server 使用insert CTE时出错
我在SQL Server 2012中收到以下错误: 无效的对象名称“库” 有没有办法修改语法,使我不必使用表变量?问题出现在代码末尾,我将into语句放在那里 代码如下: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
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。你可以在这里得到更详细的解释: