• 相关软件
    >SET @local_variable 创建者:webmaster 更新时间:2006-02-16 15:51

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



    语法


    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



    是除 cursortextntext image 外的任何类型变量的名称。变量名必须以 at 符 (@) 开头。变量名必须符合标识符规则。有关更多信息,请参见使用标识符



    expression



    是任何有效的 Microsoft® SQL Server™ 表达式。



    cursor_variable



    是游标变量的名称。如果目标游标变量先前引用了一个不同的游标,则删除先前的引用。



    cursor_name



    使用 DECLARE CURSOR 语句声明的游标名。



    CURSOR



    指定 SET 语句包含游标声明。



    SCROLL



    指定游标支持所有的提取选项(FIRST、LAST、NEXT、PRIOR、RELATIVE 和 ABSOLUTE)。如果指定 SCROLL,则不能也指定 FAST_FORWARD。



    FORWARD_ONLY



    指定游标仅支持 FETCH NEXT 选项。只能以一个方向、从第一行到最后一行检索游标。如果没有使用 STATIC、KEYSET 或 DYNAMIC 关键字指定 FORWARD_ONLY,游标将作为 DYNAMIC 实现。如果 FORWARD_ONLY 和 SCROLL 均未指定,除非指定 STATIC、KEYSET 或 DYNAMIC 关键字,否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。



    STATIC



    定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。



    KEYSET



    指定当游标打开时,游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改(由游标所有者更改或由其它用户提交)在用户滚动游标时是可视的。其他用户进行的插入是不可视的(不能通过 Transact-SQL 服务器游标进行插入)。如果某行已删除,则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视,对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新,则新值可视。



    DYNAMIC



    定义一个游标,以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持绝对和相对提取选项。



    FAST_FORWARD



    指定启用了优化的 FORWARD_ONLY 和 READ_ONLY 游标。如果指定 FAST_FORWARD,则不能也指定 SCROLL。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。



    READ_ONLY



    防止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。



    SCROLL LOCKS



    指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标时,SQL Server 会锁定这些行,以确保它们稍后可进行修改。如果还指定了 FAST_FORWARD,则不能指定 SCROLL_LOCKS。



    OPTIMISTIC



    指定如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时 SQL Server 不锁定行。相反,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 语句。



    变量只能用在表达式中,不能代替对象名或关键字。若要构造动态 SQL 语句,请使用 EXECUTE。



    SET @cursor_variable 的语法规则不包含 LOCAL 和 GLOBAL 关键字。当使用 SET @cursor_variable = CURSOR... 语法时,根据 default to local cursor 数据库选项的设置,游标将创建为 GLOBAL 或 LOCAL。



    即使游标变量引用全局游标,它们也始终是局部变量。当游标变量引用全局游标时,该游标既有全局游标引用,也有局部游标引用。有关更多信息,请参见示例 C。



    有关更多信息,请参见 DECLARE CURSOR



    权限


    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 语句中使用该局部变量查找居住在犹他州的所有作者的姓名。



    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


    C. 对全局游标使用 SET


    下例创建一个局部变量,然后将游标变量设置为全局游标名。



    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.                         */


    D. 使用 SET 定义游标


    下例使用 SET 语句定义游标。



    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


    E. 通过查询赋值


    下例使用查询给变量赋值。



    USE Northwind
    GO
    DECLARE @rows int
    SET @rows = (SELECT COUNT(*) FROM Customers)
    相关文章
    本页查看次数: