SET @local_variable (Transact-SQL)

将先前使用 DECLARE **@**local_variable 语句创建的指定局部变量设置为指定值。

主题链接图标Transact-SQL 语法约定

语法

SET 
{ @local_variable 
    [:: property_name | field_name ] = expression | udt_name { . | :: } method_name(argument [ ,...n ] ) 
}
| 
{ @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

cursortextntextimagetable 以外的任何类型变量的名称。变量名称必须以 at 符号 (@) 开头。变量名称必须符合标识符规则。

property_name

用户定义类型的属性。

field_name

用户定义类型的公共字段。

udt_name

公共语言运行时 (CLR) 用户定义类型的名称。

{ . | :: }

指定 CLR 用户定义类型的方法。对于实例(非静态)方法,请使用句点 (.)。对于静态方法,请使用两个分号 (::)。若要调用 CLR 用户定义类型的方法、属性或字段,必须对类型具有 EXECUTE 权限。

method_name**(**argument [ ,... n ] )

用户定义类型的方法,它带有一个或多个参数以修改类型实例的状态。静态方法必须是公共的。

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 为默认值。

ms189484.note(zh-cn,SQL.90).gif注意:
在 SQL Server 2000 中,FAST_FORWARD 和 FORWARD_ONLY 游标选项是互相排斥的。如果指定了其中一个,就不能指定另一个,否则会引发错误。在 SQL Server 2005 中,这两个关键字可以用在同一个 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。

ms189484.note(zh-cn,SQL.90).gif注意:
在 SQL Server 2000 中,FAST_FORWARD 和 FORWARD_ONLY 游标选项是互相排斥的。如果指定了其中一个,就不能指定另一个,否则会引发错误。在 SQL Server 2005 中,这两个关键字可以用在同一个 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。

如果每个基础表都没有唯一索引,并且请求了 SQL-92 SCROLL 游标或 Transact-SQL KEYSET 游标,则游标将自动成为 STATIC 游标。

如果 select_statement 包含 ORDER BY 子句,且其中的列不是唯一的行标识符,则 DYNAMIC 游标将转换为 KEYSET 游标,而如果 KEYSET 游标不能打开,则该游标转换为 STATIC 游标。这一点同样适用于使用不带 STATIC 关键字的 SQL-92 语法定义的游标。

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... 语法时,根据 default to local cursor 数据库选项的设置,游标将创建为 GLOBAL 或 LOCAL。

即使游标变量引用全局游标,它们也始终是局部变量。如果游标变量引用全局游标,则该游标既有全局游标引用,也有局部游标引用。有关详细信息,请参阅示例 C。

有关详细信息,请参阅 DECLARE CURSOR (Transact-SQL)

权限

要求具有 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. 对全局游标使用 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.

D. 使用 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;

E. 通过查询赋值

以下示例使用查询为变量赋值。

USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;

F. 通过修改类型属性为用户定义类型的变量赋值

以下示例通过修改类型的 X 属性的值来设置用户定义类型 Point 的值。

DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO

G. 通过调用类型的方法为用户定义类型的变量赋值

以下示例通过调用类型的 SetXY 方法设置用户定义类型 point 的值。

DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);

请参阅

参考

DECLARE @local\_variable (Transact-SQL)
EXECUTE (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)

其他资源

表达式(数据库引擎)
使用变量和参数(数据库引擎)

帮助和信息

获取 SQL Server 2005 帮助