2011-04-28 48 views
2

如果我想對結果集的每一行進行多次操作,是否必須使用循環或遊標。有沒有其他有效或方便的方法來做到這一點?我正在寫一個很長的存儲過程,我爲外部循環使用了只讀遊標。我還需要一些循環內部的循環。 (我是新的程序員,我的英文不好,希望有人能幫助我。)如果我想對結果集的每一行進行多次操作

+2

你能描述一下你想要的操作類型嗎?對於SQL,循環*通常不是答案。如果你可以制定一個體現你想要的*的單一查詢,並讓系統擔心它是如何產生答案的,那麼這個系統會更好。 – 2011-04-28 06:34:30

+0

最佳方法:將結果集放入臨時表(或表變量)中,然後使用基於**方法的**方法對臨時表進行操作 - 例如, SELECT,UPDATE等 - **不是**遊標。 – 2011-04-28 06:35:33

+0

我首先使用結果集的所有id向其他表中插入一些數據,然後更新所有結果集 – xiemeilong 2011-04-28 06:44:59

回答

1

在你的問題中仍然沒有足夠的信息來給出一個很好的答案。我將分享一些可能「足夠」的代碼,以幫助您查看重新投射問題以避免遊標/循環的一種方式。假設我們有一張我們用作隊列的表(稱爲隊列)。對於這個簡單的例子,所有我們存儲的是,我們希望後面插入到另一個表(稱爲目標)的值(動作):

create table Queue (
    QueueID int IDENTITY(1,1) not null, 
    Action varchar(10) not null, 
    Processed bit not null, 
    TargetID int null, 
    constraint PK_Queue PRIMARY KEY (QueueID), 
    constraint CK_Queue_Processed CHECK (Processed = 0 or TargetID is not null) 
) 
go 
create table Target (
    TargetID int IDENTITY(1,1) not null, 
    Action varchar(10) not null, 
    constraint PK_Target PRIMARY KEY (TargetID) 
) 

需要注意的是,一旦一個項目已經從隊列表處理,我們希望將其標記爲已處理(Processed = 1),並且我們想知道我們最終將哪一行插入到目標表(TargetID)中。

那麼,讓我們來創建一些示例行過程:

insert into Queue(Action,Processed) 
select 'abc',0 union all 
select 'def',0 union all 
select 'ghi',0 

而現在,我們會處理這個隊列中,首先將行插入到目標表,然後適當地更新隊列表:

declare @Inter table (QueueID int not null,TargetID int not null) 

;merge into Target using (select QueueID,Action from Queue where Processed=0) Queue 
on 1=0 
when not matched then insert (Action) values (Action) 
output Queue.QueueID,inserted.TargetID into @Inter (QueueID,TargetID); 

update q 
set 
    Processed = 1, 
    TargetID = i.TargetID 
from 
    Queue q 
     inner join 
    @Inter i 
     on 
      q.QueueID = i.QueueID 

我們可以用一個簡單的insert聲明(而不是merge),如果我們將足夠的信息到目標表(例如QueueID),使得我們可以檢索的一切,我們需要我n inserted僞表的@Inter表。

最後,我們檢查這兩個表,以保證如我們所料,它的工作:

select * from Queue 
select * from Target 

在我的機器,分配給該行TargetIDs匹配QueueIDs,但不能保證。

以上是對我對How Can I avoid using Cursor for implementing this pseudo code - SQL Server的回答的重新處理,其中包括在更新原始表之前對第二個表執行進一步插入操作。

+0

非常感謝。我從你的回答中學到了一些東西。 – xiemeilong 2011-04-28 11:42:21