使用select query

时间:2017-08-10 18:55:28

标签: sql sql-server database

我试图完成以下事情: 我收到了一份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;

1 个答案:

答案 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表视为一个队列,一次一个地拉出行,直到它为空。