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

推荐订阅源

L
LINUX DO - 最新话题
G
Google Developers Blog
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
F
Full Disclosure
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
Help Net Security
Help Net Security
The Hacker News
The Hacker News
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
博客园 - 聂微东
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
N
News | PayPal Newsroom
A
About on SuperTechFans
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
罗磊的独立博客
K
Kaspersky official blog
The Cloudflare Blog
I
Intezer

博客园 - 雨后出太阳

代码新建二维表 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 瞬間爆增,影響效能。