惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
H
Hacker News: Front Page
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
Lohrmann on Cybersecurity
Cisco Talos Blog
Cisco Talos Blog
O
OpenAI News
S
Securelist
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
H
Heimdal Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
Latest news
Latest news
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic
D
Docker
D
DataBreaches.Net
A
About on SuperTechFans
T
Tor Project blog
V
V2EX
G
Google Developers Blog
博客园 - Franky
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
I
InfoQ
H
Help Net Security
V2EX - 技术
V2EX - 技术
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security Affairs
SecWiki News
SecWiki News
The Register - Security
The Register - Security
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
小众软件
小众软件
B
Blog
T
Threatpost
P
Palo Alto Networks Blog
博客园 - 【当耐特】
L
LangChain Blog
AWS News Blog
AWS News Blog
月光博客
月光博客
宝玉的分享
宝玉的分享

博客园 - 雨后出太阳

代码新建二维表 8招助你远离咽炎 C# 数据的加密解密 DbHelperSQL 判断数据库表结构公用方法 浏览器变灰的实现方式 林仕鼎:互联网正发生模式变革 网摘:互联网的2/8原则 红杉投资过程的独特之处 [转]毕业5年,同学之间差距为何这么大 - 雨后出太阳 - 博客园 ADO.NET数据存取技术与O/R Mapping演进[转] 工作以后十不要 减少奋斗30年 怎么算是优秀的程序员--写给工作2,3年了的同行 少走弯路的十条忠告 使用 DataFormatString 属性来提供列中各项的自定义格式 .NET世界的M型化--原文作者奚江华 <转>[创业经验]程序员创业:我的软件推广成功之路 一个程序员的C#命名规则<转> 推荐奚江华著《圣殿祭祀ASP.NET 3.5 专家技术手册 C#篇-----及他的TW博客进入方法》 C#算法
SQL Server 游标使用方法
雨后出太阳 · 2013-06-08 · via 博客园 - 雨后出太阳

SQL Server DML 語法(SELECT、UPDATE 和 DELETE)是以資料集為資料處理單位,方便且有效率,而 Cursor 則是以記錄為資料處理單位,對於資料操作彈性較大。
SQL Cursor 的基礎架構。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

DECLARE curTemp CURSOR  

  FOR

      (

        SELECT Col1,Col2,Col3......

        FROM SourceTable

        WHERE Condition

      )

OPEN curTemp

DECLARE @var1 as .....

DECLARE @var2 as .....

FETCH NEXT FROM curTemp INTO @var1,@var2

  WHILE (@@FETCH_STATUS = 0)

    BEGIN  

      ....................

      FETCH NEXT FROM curTemp INTO @var1,@var2  

    END

CLOSE curTemp

DEALLOCATE curTemp

    使用 Cursor 會導致 SQLServer 效能不彰,應視為最後手段,但假如使用時請注意下列事項:
  1. 盡量由前往後讀取資料就好 FORWARD_ONLY 和 FETCH NEXT 為預設值,不要使用 SCROLL 和 FETCH PRIOR、FETCH FIRST、FETCH LAST 等語法,個人習慣通常都會設定 FAST_FORWARD 來提高效率。
  2. 不要利用 Cursor 來修改和刪除資料,能明確指定為 READ_ONLY 較好。


判斷 Cursor 中的最後一筆資料利用 @@CURSOR_ROWS 來查詢最近一次 OPEN 的 Cursor 中有多少筆資料。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

DECLARE @Temp Table (EmpNO char(5),EmpName nchar(8))

INSERt INTO @Temp VALUES ('00001','張三')

INSERt INTO @Temp VALUES ('00002','李四')

INSERt INTO @Temp VALUES ('00003','王五')

DECLARE curTemp CURSOR STATIC

  FOR

     (

       SELECT EmpNO,EmpName

       FROM @Temp

       WHERE EmpNO IN ('00001','00002')

     )

OPEN curTemp

DECLARE @EmpNO as char(5),@EmpName nchar(8)

DECLARE @Count as smallint

SET @Count = 0

FETCH NEXT FROM curTemp INTO @EmpNO,@EmpName

  WHILE (@@FETCH_STATUS = 0)

    BEGIN 

      SET @Count = @Count + 1

      IF @Count = @@CURSOR_ROWS

          PRINT '最後一筆資料為 ' + @EmpName

      FETCH NEXT FROM curTemp INTO @EmpNO,@EmpName

    END

CLOSE curTemp

DEALLOCATE curTemp

    說明:
  1. 由於動態資料指標會反映所有變更,因此,Cursor 內資料列數會不斷改變,@@CURSOR_ROWS 永遠不可能明確指出 Cursor 內有多少資料列數,也因此必須把 Cursor 設為靜態指標(STATIC)。
  2. 宣告 Cursor 為 STATIC,會先把資料放進 TempDB 內,應盡量縮小資料量,以免 TempDB 瞬間爆增,影響效能。