我有一个用于查找原始位置的脚本。它以这样的表格开始: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;
非常感谢您的任何提示或建议。
我正在创建一个存储过程,用于从 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'