我正在编写一个程序来获取特定机器的所有部件和子部件。但是,有可能一个子部分也有子部分等等。在顶层,零件有一个修订号,之后,我取子零件的最大修订号,因为我想要最新的(每个修订都有相同的子零件,它只是改变的图纸而我没有'不在乎)。到目前为止,我得到了这个:
CREATE TABLE [dbo].[PartMtl_3](
[PartNum] [nvarchar](50) ,
[RevisionNum] [nvarchar](16) NULL,
[MtlPartNum] [nvarchar](70)
) ON [PRIMARY]
--Here I can't put a primary key because
--it should be PartNum and RevisionNum and MtlPartNum together
-- but i know some of the data have a null in the revision
-- and tsql don't support a pk null
Input parameter for the procedure @Machine VARCHAR(30)
DECLARE @Mytable TABLE
(
id INT IDENTITY(1,1) NOT NULL,
PartNum VARCHAR(70),
RevisionNum VARCHAR(16),
Processed TINYINT,
ParentId INT
)
DECLARE @ID INT;
DECLARE @PartNum VARCHAR(70)
DECLARE @RevisionNum VARCHAR(16)
INSERT INTO @Mytable(PartNum,RevisionNum,Processed,ParentId)
SELECT PartNum,RevisionNum,0,NULL WHERE Machine=@Machine
--Whith this insert I have my top parts for the machine
WHILE (SELECT COUNT(*) FROM @Mytable WHERE Processed=0)>0
BEGIN
SELECT TOP 1 @ID=id,@PartNum=PartNum,@RevisionNum=RevisionNum Where Processed=0
INSERT INTO @MyTable(PartNum,RevisionNum,Processed,ParentId)
SELECT MtlPartNum,(SELECT MAX(RevisionNum) FROM PartMtl_3
WHERE PartNum=MtlPartNum) AS RevisionNum,0,@Id FROM PartMtl_3
WHERE PartNum=@PartNum AND RevisionNum=@RevisionNum
UPDATE @Matable SET Processed=1 Where id=@Id
END
--other code here to basically insert the result of @Mytable in a real table
我知道这个程序可以工作,但是它真的很慢并且吃掉了服务器的所有资源。那么是否可以通过使用游标(我认为它非常接近所以我怀疑这种方法)或设置基本操作来优化它?