在 SQL Server 中,SELECT 語句并不總是與服務(wù)器上的游標(biāo)關(guān)聯(lián)。默認(rèn)情況下,SQL Server 只是把 SELECT 語句的結(jié)果集合行依次返回給客戶。SELECT 一執(zhí)行,數(shù)據(jù)流就開始了。結(jié)果集數(shù)據(jù)流也可以由存儲(chǔ)過程的 SELECT 語句返回。此外,對(duì)于單個(gè) EXECUTE 語句,單個(gè)存儲(chǔ)過程或一批命令可能返回多個(gè)結(jié)果集。
一旦這些默認(rèn)結(jié)果集可用,SQL Server 客戶就負(fù)責(zé)提取它們。對(duì)于默認(rèn)結(jié)果集,客戶的提取不產(chǎn)生到服務(wù)器的往返。相反地,對(duì)默認(rèn)結(jié)果集的提取可將數(shù)據(jù)從網(wǎng)絡(luò)緩沖區(qū)讀取到程序變量中。默認(rèn)結(jié)果集模型創(chuàng)建了一種有效的機(jī)制,在通過網(wǎng)絡(luò)的一次往返,向客戶機(jī)返回多行數(shù)據(jù)。將網(wǎng)絡(luò)往返次數(shù)最小化,通常是改善客戶/服務(wù)器應(yīng)用程序性能最重要的因素。
和 Oracle 游標(biāo)相比,默認(rèn)結(jié)果集賦予了 SQL Server 客戶應(yīng)用程序更多的職責(zé)。SQL Server 客戶應(yīng)用程序必須立即提取 EXECUTE 語句返回的所有結(jié)果集行。假如應(yīng)用程序需要逐步地將行提供給程序的其它部分,它必須將行緩存在一個(gè)內(nèi)部數(shù)組中。假如它未能提取所有的結(jié)果集行,則與 SQL Server 連接仍然保持繁忙。
Microsoft SQL Server 提供了“服務(wù)器游標(biāo)”,來滿足通過網(wǎng)絡(luò)逐步提取結(jié)果集的需要??赏ㄟ^調(diào)用 SQLSetStmtOption 設(shè)定 SQL_CURSOR_TYPE 選項(xiàng),在應(yīng)用程序中請(qǐng)求服務(wù)器游標(biāo)。
在提取請(qǐng)求的間隙,連接保持空閑,以執(zhí)行其它命令,包括其它游標(biāo)的 OPEN 或 FETCH 請(qǐng)求。在 ODBC 術(shù)語中,它是指服務(wù)器游標(biāo)答應(yīng) SQL Server 驅(qū)動(dòng)程序在單個(gè)連接上支持多個(gè)活動(dòng)語句。
因?yàn)?SQL Server 支持可滾動(dòng)游標(biāo),所以可將 SQL Server 游標(biāo)定位到任何行??梢韵蚯昂拖蚝鬂L動(dòng)。對(duì)于許多涉及用戶界面的應(yīng)用程序,可滾動(dòng)性是一個(gè)很有用的功能。有了可滾動(dòng)游標(biāo),應(yīng)用程序可以一次提取一整屏的行,并且可按照用戶請(qǐng)求,只提取附加行。
盡管 Oracle 并不直接支持可滾動(dòng)游標(biāo),但是可以使用一個(gè) ODBC 選項(xiàng),將這一限制減至最小。例如,一些 Oracle ODBC 驅(qū)動(dòng)程序(例如與 Microsoft Developer Studio 可視化開發(fā)系統(tǒng)一起發(fā)行的 Oracle ODBC 驅(qū)動(dòng)程序)可在驅(qū)動(dòng)程序中提供基于客戶的可滾動(dòng)游標(biāo)。