我有一個結點表,它包含項目之間的相關性。我正在使用它以編程方式創建顯示這些依賴關係的甘特圖。我現在有一個可用的存儲過程,但是我的公司的政策是儘可能避免遊標。我把它放在那裏,你可以在沒有光標的情況下做到這一點嗎? DATA: 我可以不使用此遊標嗎
declare @BaseTable Table
(
[IssueDependencyId] [bigint] IDENTITY(1,1) NOT NULL,
[IssueId] [bigint] NOT NULL,
[DependsOnIssueId] [bigint] NOT NULL
)
INSERT INTO @BaseTable SELECT 48, 0 UNION ALL SELECT 49, 48 UNION ALL SELECT 50, 48 UNION ALL SELECT 51, 48 UNION ALL SELECT 55, 48 UNION ALL SELECT 56, 48 UNION ALL SELECT 52, 49 UNION ALL SELECT 52, 50 UNION ALL SELECT 52, 51 UNION ALL SELECT 53, 52 UNION ALL SELECT 57, 54 UNION ALL SELECT 54, 55 UNION ALL SELECT 57, 56
SELECT * FROM @BaseTable
存儲過程的代碼:
DECLARE @IssueId int, @DependsOnIssueId int, @StartPoint int, @EndPoint int
SET @StartPoint = 0
SET @EndPoint = 10
DECLARE @ResultsTable TABLE (
IssueId int not null,
DependsOnIssueId int not null,
Start_Point int,
End_Point int
)
Select IssueId, DependsOnIssueId
INTO #tmp1
FROM IssueDependency
WHERE UpperLevelIssueId = 48
ORDER BY DependsOnIssueId
declare MyCursor Cursor for (Select IssueId, DependsOnIssueId from #tmp1);
OPEN MyCursor
FETCH NEXT FROM MyCursor
INTO @IssueId, @DependsOnIssueId
WHILE @@FETCH_STATUS = 0
BEGIN
--get parent position to set start
SELECT @StartPoint = ISNULL(End_Point, 0)
FROM @ResultsTable WHERE IssueId = @DependsOnIssueId
SET @EndPoint = @StartPoint + 10
INSERT INTO @ResultsTable VALUES
(@IssueId, @DependsOnIssueId, @StartPoint, @EndPoint)
FETCH NEXT FROM MyCursor
INTO @IssueId, @DependsOnIssueId
END
Close MyCursor
DEALLOCATE MyCursor;
SELECT IssueId,
MAX(start_point) max_start_point,
MAX(end_point) max_end_point
INTO #MaxPoints
from @ResultsTable
GROUP BY IssueId
SELECT r.IssueId,DependsOnIssueId,
max_start_point start_point,
max_end_point end_point
FROM @ResultsTable r
JOIN #MaxPoints m ON m.IssueId = r.IssueId
ORDER BY r.IssueId
得到的數據
IssueId DependsOnIssueId Start_Point End_Point
--------------------------------------------------------------------
48 0 0 10
49 48 10 20
50 48 10 20
51 48 10 20
52 49 20 30
52 50 20 30
52 51 20 30
53 52 30 40
54 55 20 30
55 48 10 20
56 48 10 20
57 54 30 40
57 56 30 40
你的幫助非常感謝!
爲避免使用遊標而不是在單條記錄上應用計算或操作,請對所有記錄執行此操作並選擇必要的記錄 – Nithesh
從SQL Server 2008起,您可以使用表值構造函數替代union all來填充表 - http:// technet。 magic!microsoft.com/en-us/library/dd776382.aspx – gotqn