SET @local_variable (Transact-SQL)
將先前利用 DECLARE @local\_variable 陳述式來建立的指定本機變數設為指定的值。
語法
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
|
{ @SQLCLR_local_variable.mutator_method
}
|
{ @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 或 table 以外任何類型的變數名稱。變數名稱的開頭必須是 @ 記號 (@)。變數名稱必須符合識別碼的規則。property_name
這是使用者定義型別的屬性。field_name
這是使用者定義型別的公用欄位。udt_name
這是 Common Language Runtime (CLR) 使用者定義型別的名稱。{ . | :: }
指定 CLR 使用者定義型別的方法。如果是執行個體 (非靜態) 方法,請使用句點 (.)。如果是靜態方法,請使用兩個冒號 (::)。若要叫用 CLR 使用者定義類型的方法、屬性或欄位,您必須具有類型的 EXECUTE 權限。method_name**(**argument [ ,... n ] )
這是利用一或多個引數來修改類型執行個體狀態的使用者定義型別。靜態方法必須是公用的。**@**SQLCLR_local_variable
這是類型位於組件中的變數。如需詳細資訊,請參閱<Common Language Runtime (CLR) 整合程式設計概念>。mutator_method
這是可以變更物件狀態之組件中的方法。SQLMethodAttribute.IsMutator 將會套用到這個方法。{ += | -= | *= | /= | %= | &= | ^= | |= }
複合指派運算子:+= 加入並指派
-= 減去並指派
*= 乘以並指派
/= 除以並指派
%= 模除並指派
&= 位元 AND 並指派
^= 位元 XOR 並指派
|= 位元 OR 並指派
expression
這是任何有效的運算式。cursor_variable
這是資料指標變數的名稱。如果目標資料指標先前參考不同的資料指標,就會移除先前的參考。cursor_name
這是利用 DECLARE CURSOR 陳述式來宣告的資料指標名稱。CURSOR
指定 SET 陳述式包含資料指標的宣告。SCROLL
指定資料指標支援所有提取選項:FIRST、LAST、NEXT、PRIOR、RELATIVE 和 ABSOLUTE。當您也指定了 FAST_FORWARD 時,便不能指定 SCROLL。FORWARD_ONLY
指定資料指標只支援 FETCH NEXT 選項。您只能依單一方向,從第一個到最後一個資料列擷取資料指標。當指定不含 STATIC、KEYSET 或 DYNAMIC 等關鍵字的 FORWARD_ONLY 時,會將資料指標實作成 DYNAMIC。當 FORWARD_ONLY 和 SCROLL 兩者都沒有指定時,除非指定了 STATIC、KEYSET 或 DYNAMIC 等關鍵字,否則,預設值是 FORWARD_ONLY。如果是 STATIC、KEYSET 和 DYNAMIC 資料指標,預設值便是 SCROLL。[!附註]
在 SQL Server 2000 中,FAST_FORWARD 和 FORWARD_ONLY 資料指標選項互斥。如果指定了其中一個選項,便不能指定另一個選項,否則,會引發錯誤。可以在相同的 DECLARE CURSOR 陳述式中使用這兩個關鍵字。
STATIC
定義一個建立資料暫存副本供資料指標本身使用的資料指標。對於這個資料指標的所有要求都是從 tempdb 的這份暫存資料表回答的;因此,修改基底資料表不會反映在提取這個資料指標所傳回的資料中,而且這個資料指標不允許進行修改。KEYSET
指定在開啟資料指標時,修正資料指標中之資料列的成員資格和順序。用來唯一識別資料列的索引鍵組會內建在 tempdb 的 keyset 資料表中。當資料指標擁有者捲動資料指標時,基底資料表中非索引鍵的變更,不論是資料指標擁有者所進行的變更,或其他使用者所認可的變更,都是可見的。其他使用者進行的插入便看不到,且無法利用 Transact-SQL 伺服器資料指標來插入。如果刪除某個資料列,嘗試提取此資料列的動作會傳回 @@FETCH_STATUS 的值 -2。從資料指標之外更新索引鍵值,類似於先刪除舊資料列,再插入新資料列。含有新值的資料列不可見,試圖提取有舊值的資料列會傳回 @@FETCH_STATUS 的值 -2。如果更新是藉由指定 WHERE CURRENT OF 子句透過資料指標執行,便可看到新值。
DYNAMIC
定義一個資料指標,使資料指標擁有者捲動資料指標時,資料指標能夠反映結果集資料列的所有資料變更。每次提取時,資料列的資料值、順序和成員資格都有可能改變。動態資料指標不支援這個絕對和相對的提取選項。FAST_FORWARD
指定啟用了最佳化的 FORWARD_ONLY、READ_ONLY 資料指標。當您也指定了 SCROLL 時,便不能指定 FAST_FORWARD。[!附註]
在 SQL Server 2000 中,FAST_FORWARD 和 FORWARD_ONLY 資料指標選項互斥。如果指定了其中一個選項,便不能指定另一個選項,否則,會引發錯誤。可以在相同的 DECLARE CURSOR 陳述式中使用這兩個關鍵字。
READ_ONLY
防止利用這個資料指標來更新。UPDATE 或 DELETE 陳述式中的 WHERE CURRENT OF 子句無法參考這個資料指標。這個選項會覆寫要更新之資料指標的預設功能。SCROLL LOCKS
指定保證利用資料指標來進行的定位更新或刪除會成功。將資料列讀入資料指標時,SQL Server 會鎖定這些資料列,以保證後來的修改動作能夠使用它們。當您也指定了 FAST_FORWARD 時,便不能指定 SCROLL_LOCKS。OPTIMISTIC
指定如果將資料列讀入資料指標之後,又更新了這些資料列,則利用資料指標來進行的定位更新或刪除不會成功。將資料列讀入資料指標時,SQL Server 不會鎖定這些資料列。但是,它會利用 timestamp 資料行值的比較 (如果資料表沒有 timestamp 資料行,便會利用總和檢查碼值) 來判斷資料列讀入資料指標之後,是否修改資料列。如果修改了資料列,嘗試執行的定位更新或刪除便會失敗。當您也指定了 FAST_FORWARD 時,便不能指定 OPTIMISTIC。TYPE_WARNING
指定當資料指標從要求的類型隱含地轉換成另一個類型時,便傳送一則警告訊息給用戶端。FOR select_statement
這是定義資料指標結果集的標準 SELECT 陳述式。在資料指標宣告的 select_statement 內,不允許使用 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO 等關鍵字。如果使用 DISTINCT、UNION、GROUP BY 或 HAVING,或 select_list 包括彙總運算式,就會將資料指標建立成 STATIC。
如果每個基礎資料表都沒有唯一索引,且要求 ISO SCROLL 資料指標或 Transact-SQL KEYSET 資料指標,它會自動成為 STATIC 資料指標。
如果 select_statement 包含 ORDER BY 子句,且該子句中的資料行不是唯一資料列識別碼,就會將 DYNAMIC 資料指標轉換成 KEYSET 資料指標,如果無法開啟 KEYSET 資料指標,便會轉換成 STATIC 資料指標。使用 ISO 語法所定義的資料指標也是如此,但不含 STATIC 關鍵字。
READ ONLY
防止利用這個資料指標來更新。UPDATE 或 DELETE 陳述式中的 WHERE CURRENT OF 子句無法參考這個資料指標。這個選項會覆寫要更新之資料指標的預設功能。這個關鍵字有別於先前的 READ_ONLY,READ 和 ONLY 之間是空格,而不是底線。UPDATE [OF column_name[ ,...n ] ]
在資料指標內定義可更新的資料行。如果提供了 OF column_name [,...n],便只允許修改列出的資料行。如果未提供任何清單,除非資料指標已定義為 READ_ONLY,否則,可以更新所有資料行。
備註
在宣告變數之後,會將它初始化成 NULL。請利用 SET 陳述式,將非 NULL 的值指派給宣告的變數。將值指派給變數的 SET 陳述式會傳回單一值。當您初始化多個變數時,每個區域變數都要使用個別的 SET 陳述式。
變數只能用在運算式中,不能用在物件名稱或關鍵字中。若要建構動態 Transact-SQL 陳述式,請使用 EXECUTE。
SET **@**cursor_variable 的語法規則不包括 LOCAL 和 GLOBAL 關鍵字。當使用 SET **@**cursor_variable = CURSOR... 語法時,會將資料指標建立成 GLOBAL 或 LOCAL,這會隨著 default to local cursor 資料庫選項的設定而不同。
資料指標變數一律是區域變數,即使它們參考了全域資料指標也是如此。當資料指標變數參考全域資料指標時,資料指標會同時有全域和本機資料指標參考。如需詳細資訊,請參閱「範例 C」一節。
如需詳細資訊,請參閱<DECLARE CURSOR (Transact-SQL)>。
複合指派運算子可用於您在運算子右手邊有指派運算式的任何地方,其中包括變數以及 UPDATE、SELECT 和 RECEIVE 陳述式中的 SET。
權限
需要 public 角色中的成員資格。所有使用者都可以使用 SET **@**local_variable。
範例
A. 列印利用 SET 來初始化的變數值
下列範例會建立 @myvar 變數,將字串值放入這個變數中,再列印 @myvar 變數的值。
DECLARE @myvar char(20);
SET @myvar = 'This is a test';
SELECT @myvar;
GO
B. 使用以 SELECT 陳述式中的 SET 指派值的本機變數
下列範例會建立一個名稱為 @state 的本機變數,且會在 SELECT 陳述式中利用這個本機變數來尋找在 Oregon 州的所有員工的姓名。
USE AdventureWorks;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
C. 針對本機變數使用複合指派
下列兩個範例會產生相同的結果。它們會建立一個名為 @NewBalance 的區域變數,並將它乘以 10,然後將區域變數的新值顯示在 SELECT 陳述式中。第二個範例會使用複合指派運算子。
/* Example one */
DECLARE @NewBalance int ;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
/* Example Two */
DECLARE @NewBalance int = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
D. 搭配全域資料指標來使用 SET
下列範例會建立一個本機變數,再將資料指標變數設成全域資料指標名稱。
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E. 利用 SET 來定義資料指標
下列範例會利用 SET 陳述式來定義資料指標。
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
F. 從查詢中指派值
下列範例會利用查詢來指派變數值。
USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
G. 修改此類型的屬性來指派使用者定義類型的變數值
下列範例會修改類型之 X 屬性的值來設定使用者定義型別 Point 的值。
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
H. 叫用此類型的方法來指派使用者定義類型的變數值
下列範例會叫用類型的 SetXY 方法來設定使用者定義型別 point 的值。
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. 建立 CLR 類型的變數,並呼叫 mutator 方法
下列範例會建立 Point 類型的變數,然後在 Point 中執行 mutator 方法。
CREATE ASSEMBLY mytest from 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
變更記錄
更新的內容 |
---|
將 @SQLCLR_local_variable.mutator_method 新增至<語法>一節,並將變數的說明新增至<引數>一節。 |
已新增範例 I。 |