我试图完成以下事情: 我收到了一份DocumentID。查找表中与特定DocumentID匹配的所有记录,例如,我有10条记录匹配,并且每条记录都具有不同的DocumentAttachmentID。 我用新数据更新所有记录。 问题是我需要将这10条记录中的一些信息+收到的其他信息插入到新表中,即历史表,即我需要在那里插入10条新记录。
我已经用Cursor成功了,但由于性能的原因,Cursor看起来并不是很好。
有没有办法循环我从这个表中选择的10条记录,并为每条记录提供一些信息,添加一些额外的信息,然后将其插入另一个表中?
编辑: 我试着用循环来做这个(谢谢大家的答案) 我明天会试试,你觉得这会起作用吗?:
通过第一次更新,我更新了所有documentAttachments, 第二个块是INSERT TO,它应该在另一个表中插入所有文档附件以及一些额外的列。
UPDATE [sDocumentManagement].[tDocumentAttachments]
SET DeletedBy = @ChangedBy,
DeletedOn = @CurrentDateTime,
IsDeleted = 1,
WHERE DocumentID = @DocumentID;
INSERT INTO [sDocumentManagement].[tDocumentHistory] ( DocumentAttachmentID, DocumentID, ActivityCodeID, ChangedOn, ChangedBy, AdditionalInformation )
SELECT DocumentAttachmentID,
@DocumentID, [sCore].[GetActivityCodeIDByName] ( 'DeletedDocument' ),
@CurrentDateTime,
@ChangedBy,
@AdditionalInformation
FROM [sDocumentManagement].[tDocumentAttachments]
WHERE DocumentID = @DocumentID;
答案 0 :(得分:1)
没有光标循环我经常使用以下技术:
DECLARE @items TABLE(id INT, val INT);
DECLARE @id INT;
DECLARE @val INT;
WHILE EXISTS(SELECT * FROM @items) BEGIN
SELECT TOP(1) @id = id, @val = val FROM @items;
DELETE FROM @items WHERE (id = @id);
--do what is needed with the values here.
SELECT @id, @val;
END
这会将@items表视为一个队列,一次一个地拉出行,直到它为空。