SET @local_variable SET @local_variable - 北京怡康軟件科技有限公司 資源網(wǎng) "/>
將先前使用 DECLARE @local_variable 語句創(chuàng)建的指定局部變量設(shè)置為給定的值。
SET { { @local_variable = expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] }
]
}
} }
}
@local_variable
是除 cursor、text、ntext 或 image 外的任何類型變量的名稱。變量名必須以 at 符 (@) 開頭。變量名必須符合標(biāo)識符規(guī)則。有關(guān)更多信息,請參見使用標(biāo)識符。
expression
是任何有效的 Microsoft® SQL Server™ 表達(dá)式。
cursor_variable
是游標(biāo)變量的名稱。如果目標(biāo)游標(biāo)變量先前引用了一個(gè)不同的游標(biāo),則刪除先前的引用。
cursor_name
使用 DECLARE CURSOR 語句聲明的游標(biāo)名。
CURSOR
指定 SET 語句包含游標(biāo)聲明。
SCROLL
指定游標(biāo)支持所有的提取選項(xiàng)(FIRST、LAST、NEXT、PRIOR、RELATIVE 和 ABSOLUTE)。如果指定 SCROLL,則不能也指定 FAST_FORWARD。
FORWARD_ONLY
指定游標(biāo)僅支持 FETCH NEXT 選項(xiàng)。只能以一個(gè)方向、從第一行到最后一行檢索游標(biāo)。如果沒有使用 STATIC、KEYSET 或 DYNAMIC 關(guān)鍵字指定 FORWARD_ONLY,游標(biāo)將作為 DYNAMIC 實(shí)現(xiàn)。如果 FORWARD_ONLY 和 SCROLL 均未指定,除非指定 STATIC、KEYSET 或 DYNAMIC 關(guān)鍵字,否則默認(rèn)為 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游標(biāo)默認(rèn)為 SCROLL。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一個(gè),則不能指定另一個(gè)。
STATIC
定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對游標(biāo)的所有請求都從 tempdb 中的這一臨時(shí)表中得到應(yīng)答;因此,在對該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)中不反映對基表所做的修改,并且該游標(biāo)不允許修改。
KEYSET
指定當(dāng)游標(biāo)打開時(shí),游標(biāo)中行的成員資格和順序已經(jīng)固定。對行進(jìn)行唯一標(biāo)識的鍵集內(nèi)置在 tempdb 內(nèi)一個(gè)稱為 keyset 的表中。對基表中的非鍵值所做的更改(由游標(biāo)所有者更改或由其它用戶提交)在用戶滾動游標(biāo)時(shí)是可視的。其他用戶進(jìn)行的插入是不可視的(不能通過 Transact-SQL 服務(wù)器游標(biāo)進(jìn)行插入)。如果某行已刪除,則對該行的提取操作將返回 @@FETCH_STATUS 值 -2。從游標(biāo)外更新鍵值類似于刪除舊行后接著插入新行的操作。含有新值的行不可視,對含有舊值的行的提取操作將返回 @@FETCH_STATUS 值 -2。如果通過指定 WHERE CURRENT OF 子句用游標(biāo)完成更新,則新值可視。
DYNAMIC
定義一個(gè)游標(biāo),以反映在滾動游標(biāo)時(shí)對結(jié)果集內(nèi)的行所做的所有數(shù)據(jù)更改。行的數(shù)據(jù)值、順序和成員在每次提取時(shí)都會更改。動態(tài)游標(biāo)不支持絕對和相對提取選項(xiàng)。
FAST_FORWARD
指定啟用了優(yōu)化的 FORWARD_ONLY 和 READ_ONLY 游標(biāo)。如果指定 FAST_FORWARD,則不能也指定 SCROLL。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一個(gè),則不能指定另一個(gè)。
READ_ONLY
防止通過該游標(biāo)進(jìn)行更新。在 UPDATE 或 DELETE 語句的 WHERE CURRENT OF 子句中不能引用游標(biāo)。該選項(xiàng)替代要更新的游標(biāo)的默認(rèn)功能。
SCROLL LOCKS
指定確保通過游標(biāo)完成的定位更新或定位刪除可以成功。當(dāng)將行讀入游標(biāo)時(shí),SQL Server 會鎖定這些行,以確保它們稍后可進(jìn)行修改。如果還指定了 FAST_FORWARD,則不能指定 SCROLL_LOCKS。
OPTIMISTIC
指定如果行自從被讀入游標(biāo)以來已得到更新,則通過游標(biāo)進(jìn)行的定位更新或定位刪除不成功。當(dāng)將行讀入游標(biāo)時(shí) SQL Server 不鎖定行。相反,SQL Server 使用 timestamp 列值的比較,或者如果表沒有 timestamp 列則使用校驗(yàn)值,以確定將行讀入游標(biāo)后是否已修改該行。如果已修改該行,嘗試進(jìn)行的定位更新或定位刪除將失敗。如果還指定了 FAST_FORWARD,則不能指定 OPTIMISTIC。
TYPE_WARNING
指定如果游標(biāo)從所請求的類型隱式轉(zhuǎn)換為另一種類型,則給客戶端發(fā)送警告消息。
FOR select_statement
是定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn) SELECT 語句。在游標(biāo)聲明的 select_statement 內(nèi)不允許使用關(guān)鍵字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。
如果使用了 DISTINCT、UNION、GROUP BY 或 HAVING,或者 select_list 中包含聚合表達(dá)式,游標(biāo)將創(chuàng)建為 STATIC。
如果每個(gè)基礎(chǔ)表都沒有唯一索引,并且請求了 SQL-92 SCROLL 游標(biāo)或 Transact-SQL KEYSET 游標(biāo),則游標(biāo)將自動成為 STATIC 游標(biāo)。
如果 select_statement 包含 ORDER BY,而其中的列不是唯一的行標(biāo)識符,則 DYNAMIC 游標(biāo)將轉(zhuǎn)換為 KEYSET 游標(biāo),或者,如果 KEYSET 游標(biāo)不能打開,則轉(zhuǎn)換為 STATIC 游標(biāo)。這一點(diǎn)同樣適用于使用不帶 STATIC 關(guān)鍵字的 SQL-92 語法定義的游標(biāo)。
READ ONLY
防止通過該游標(biāo)進(jìn)行更新。在 UPDATE 或 DELETE 語句的 WHERE CURRENT OF 子句中不能引用游標(biāo)。該選項(xiàng)替代要更新的游標(biāo)的默認(rèn)功能。該關(guān)鍵字與早期的 READ_ONLY 關(guān)鍵字的不同之處是 READ 和 ONLY 之間是一個(gè)空格,而不是下劃線。
UPDATE [OF column_name [,...n]]
定義游標(biāo)內(nèi)可更新的列。如果提供了 OF column_name [,...n],則只允許修改列出的列。如果沒有提供列表,則可以更新所有的列,除非已將游標(biāo)定義為 READ_ONLY。
聲明變量后,所有變量均初始化為 NULL。使用 SET 語句將一個(gè)不是 NULL 的值賦給聲明變量。給變量賦值的 SET 語句返回單值。當(dāng)初始化多個(gè)變量時(shí),為每個(gè)局部變量使用一個(gè)單獨(dú)的 SET 語句。
變量只能用在表達(dá)式中,不能代替對象名或關(guān)鍵字。若要構(gòu)造動態(tài) SQL 語句,請使用 EXECUTE。
SET @cursor_variable 的語法規(guī)則不包含 LOCAL 和 GLOBAL 關(guān)鍵字。當(dāng)使用 SET @cursor_variable = CURSOR... 語法時(shí),根據(jù) default to local cursor 數(shù)據(jù)庫選項(xiàng)的設(shè)置,游標(biāo)將創(chuàng)建為 GLOBAL 或 LOCAL。
即使游標(biāo)變量引用全局游標(biāo),它們也始終是局部變量。當(dāng)游標(biāo)變量引用全局游標(biāo)時(shí),該游標(biāo)既有全局游標(biāo)引用,也有局部游標(biāo)引用。有關(guān)更多信息,請參見示例 C。
有關(guān)更多信息,請參見 DECLARE CURSOR。
SET @local_variable 權(quán)限默認(rèn)授予所有用戶。
下例創(chuàng)建 @myvar 變量,將一個(gè)字符串值放在變量中,并輸出 @myvar 變量的值。
DECLARE @myvar char(20)
SET @myvar = 'This is a test'
SELECT @myvar
GO
下例創(chuàng)建一個(gè)名為 @state 的局部變量,并在 SELECT 語句中使用該局部變量查找居住在猶他州的所有作者的姓名。
USE pubs
GO
DECLARE @state char(2)
SET @state = 'UT'
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS Name, state
FROM authors
WHERE state = @state
GO
下例創(chuàng)建一個(gè)局部變量,然后將游標(biāo)變量設(shè)置為全局游標(biāo)名。
DECLARE my_cursor CURSOR GLOBAL FOR SELECT * FROM authors
DECLARE @my_variable CURSOR
SET @my_variable = my_cursor
/* There is a GLOBAL declared
reference (my_cursor) and a LOCAL variable
reference (@my_variable) to the my_cursor
cursor. */
DEALLOCATE my_cursor /* There is now only a LOCAL variable
reference (@my_variable) to the my_cursor
cursor. */
下例使用 SET 語句定義游標(biāo)。
DECLARE @CursorVar CURSOR
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM Northwind.dbo.Employees
WHERE LastName like 'B%'
OPEN @CursorVar
FETCH NEXT FROM @CursorVar
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END
CLOSE @CursorVar
DEALLOCATE @CursorVar
下例使用查詢給變量賦值。
USE Northwind
GO
DECLARE @rows int
SET @rows = (SELECT COUNT(*) FROM Customers)
相關(guān)文章