8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

递归 CTE 以及如何克服循环引用错误

user915 2月前

123 0

我有一个用于查找原始位置的脚本。它以这样的表格开始:IDPreviousIDLocation 2NULL1235 321236 431239 8111237 981234 1091235 11101237 ...

我有一个用于查找原始位置的脚本。它以如下表格开始:

ID 以前的ID 地点
2 无效的 1235
3 2 1236
4 3 1239
8 11 1237
9 8 1234
10 9 1235
11 10 1237

我想找到选定数量的 ID 值的原始位置

ID
2
4
8
10
11

我寻找的结果是:

等级 ID 原始ID 地点 原始位置
0 2 2 1235 1235
2 4 2 1239 1235
0 8 8 1237 1237
2 10 8 1235 1237
3 11 8 1237 1237

ID =2 和 =4 的输出很好。但是,对于 8,10,11,这会导致循环引用并且代码中断。

问题:有没有办法解决这个问题以避免发生错误:

语句终止。语句完成前已用尽最大递归次数 100

并产生所需的输出? 我知道 8 是根,因为它是该链中最小的数字,即使该链中存在循环引用。

这是我目前为 ID 2 和 4 生成输出的脚本。如果删除值 8,10,11,它会起作用

DECLARE @IDs TABLE (
  ID INTEGER
  ,PreviousID INTEGER
  ,Location INTEGER
)

INSERT INTO @IDs
SELECT           2,null,1235
UNION ALL SELECT 3,2,1236
UNION ALL SELECT 4,3,1239
UNION ALL SELECT 8,11,1237
UNION ALL SELECT 9,8,1234
UNION ALL SELECT 10,9,1235
UNION ALL SELECT 11,10,1237

Select * from @IDs


DECLARE @ORDERID Table (OrderID nvarchar (100))
Insert into @ORDERID values
('2')
,('4')
--,('8')
--,('10')
--,('11')

;WITH q AS (
    SELECT 0 lvl,  ID, PreviousID,PreviousID LastId
        ,Location,Location as OriginalLocation
    FROM    @IDs
    where ID in (select OrderID from @ORDERID) 
    UNION ALL 
    SELECT lvl+1, q.ID,u.PreviousId,q.PreviousId LastId
       ,q.Location,u.Location
    FROM    q
            INNER JOIN @IDs u ON u.ID = q.PreviousID
            --and q.ID <> u.PreviousID and q.PreviousID <> u.ID
)
select lvl, ID, coalesce(LastId,Id) OriginalId,Location,OriginalLocation 
from q
where PreviousId is null
order by id;

非常感谢您的任何提示或建议。

帖子版权声明 1、本帖标题:递归 CTE 以及如何克服循环引用错误
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由user915在本站《t-sql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我正在创建一个存储过程,用于从 SSRS 报告服务器导出 pdf 报告。该报告需要一个名为“ExportId”的参数。该过程运行成功,但它确实...

    我正在创建一个存储过程,用于从 SSRS 报告服务器导出 PDF 报告。该报告需要一个名为“ExportId”的参数。该过程运行成功,但未创建 PDF。我在这里做错了什么?

    
    Alter PROCEDURE rsp_GenerateAndDeliverReports
        @ReportName NVARCHAR(100),
        @Parameter1Name NVARCHAR(100),
        @Parameter1Value NVARCHAR(100),
        @OutputFile NVARCHAR(100)
    AS
    BEGIN
        -- Variables
        DECLARE @executionID AS INT
        DECLARE @reportBytes AS VARBINARY(MAX)
        DECLARE @zipFilePath AS NVARCHAR(100)
        DECLARE @reportService AS INT -- Change the data type to INT
    
        -- Create an instance of the SSRS Execution Service
        EXEC sp_OACreate 'SSRS.ReportExecutionService', @reportService OUT
    
        -- Initialize the service
        EXEC sp_OASetProperty @reportService, 'Url', 'http://localhost/ReportServer/ReportExecution2005.asmx'
    
        -- Load Report 1
        EXEC sp_OAMethod @reportService, 'LoadReport', NULL, @ReportName, NULL, @executionID OUT
    
        -- Set Report 1 Parameters
        EXEC sp_OAMethod @reportService, 'SetExecutionParameters', NULL, @Parameter1Name, @Parameter1Value
    
        -- Render Report 1
        EXEC sp_OAMethod @reportService, 'Render', @reportBytes OUTPUT, 'PDF', NULL, NULL, NULL, NULL, NULL
    
        -- Close and release the service
        EXEC sp_OADestroy @reportService
    
    
    
    
    
        -- Save Report 1 as PDF
        DECLARE @sql NVARCHAR(MAX)
        SET @sql = 'DECLARE @file AS VARBINARY(MAX) 
                    SET @file = ' + CONVERT(NVARCHAR(MAX), @reportBytes, 1) + '
                    EXEC sp_writebytesfile @file, ''' + @OutputFile + ''
        EXEC sp_executesql @sql
    
    END
    
    
    EXEC rsp_GenerateAndDeliverReports @ReportName='/All Reports/Subreports/07_sub', @Parameter1Name ='ExportId', @Parameter1Value='2', @OutputFile='C:\Users\Public\Public Downloads\Report.pdf'
    
    
    
返回
作者最近主题: