如果我想對結果集的每一行進行多次操作,是否必須使用循環或遊標。有沒有其他有效或方便的方法來做到這一點?我正在寫一個很長的存儲過程,我爲外部循環使用了只讀遊標。我還需要一些循環內部的循環。 (我是新的程序員,我的英文不好,希望有人能幫助我。)如果我想對結果集的每一行進行多次操作
回答
在你的問題中仍然沒有足夠的信息來給出一個很好的答案。我將分享一些可能「足夠」的代碼,以幫助您查看重新投射問題以避免遊標/循環的一種方式。假設我們有一張我們用作隊列的表(稱爲隊列)。對於這個簡單的例子,所有我們存儲的是,我們希望後面插入到另一個表(稱爲目標)的值(動作):
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的回答的重新處理,其中包括在更新原始表之前對第二個表執行進一步插入操作。
非常感謝。我從你的回答中學到了一些東西。 – xiemeilong 2011-04-28 11:42:21
- 1. 如何讓結果集中的每一行都返回多次?
- 2. SQLAlchemy:對結果進行操作
- 3. java.sql.SQLException:對空結果集進行非法操作。驗證
- 4. 如何對結果集進行旋轉
- 5. 運行多個,如果每一次
- 6. 如何遍歷結果集並在結果集中返回每行N行
- 7. 與另一個查詢結果執行的集合操作(SUM)
- 8. 是否對結果或每個操作數進行無符號升級?
- 9. VB.NET LINQ結果集操作
- 10. Kibana對結果的操作
- 11. 將結果作爲網格/單行結果集輸出到多行
- 12. MySQL EAV SELECT一對多單行結果
- 13. 將結果集的結果與變量進行比較
- 14. 對一個方法的多個結果進行平均?
- 15. 如何對.FindAll()的結果執行操作
- 16. 使用sqlalchemy結果集進行更新
- 17. 單個結果集進行分組
- 18. 對2個數字進行按位操作以始終生成唯一結果?
- 19. 如果我想要執行一些操作,如果我將兩個iPhone靠得更近,我該怎麼做?
- 20. 如何使用SOLR URL對結果集進行排序?
- 21. Consisten結果多次運行h2o deeplearning
- 22. 如何對多個查詢的結果進行排序?
- 23. 如何爲SQL中的結果集中的每一行選擇額外的行?
- 24. 無法使用Android webview的結果進行操作?
- 25. SQL - 如果結果集包含多個行,則返回最新(id)結果
- 26. 多個結果行
- 27. 空的結果集非法操作
- 28. 許多行到一行結果
- 29. 對結果集執行計數(*)
- 30. 多個操作的並行化和結果的並置
你能描述一下你想要的操作類型嗎?對於SQL,循環*通常不是答案。如果你可以制定一個體現你想要的*的單一查詢,並讓系統擔心它是如何產生答案的,那麼這個系統會更好。 – 2011-04-28 06:34:30
最佳方法:將結果集放入臨時表(或表變量)中,然後使用基於**方法的**方法對臨時表進行操作 - 例如, SELECT,UPDATE等 - **不是**遊標。 – 2011-04-28 06:35:33
我首先使用結果集的所有id向其他表中插入一些數據,然後更新所有結果集 – xiemeilong 2011-04-28 06:44:59