DECLARE @local_variable (Transact-SQL)

更新日期: 2005 年 12 月 5 日

变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。游标变量可使用此语句声明,并可用于其他与游标相关的语句。所有变量在声明后均初始化为 NULL。

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

语法

DECLARE 
     {{ @local_variable [AS] data_type } 
    | { @cursor_variable_name CURSOR } 
    | { @table_variable_name [AS] < table_type_definition > } 
     } [ ,...n]

< table_type_definition > ::= 
     TABLE ( { < column_definition > | < table_constraint > } [ ,... ] 
      ) 

< column_definition > ::= 
          column_name { scalar_data_type | AS computed_column_expression }
     [ COLLATE collation_name ] 
     [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed,increment ) ] ] 
     [ ROWGUIDCOL ] 
     [ < column_constraint > ] 

< column_constraint > ::= 
     { [ NULL | NOT NULL ] 
     | [ PRIMARY KEY | UNIQUE ] 
     | CHECK ( logical_expression ) 
     } 

< table_constraint > ::= 
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,... ] ) 
     | CHECK ( search_condition ) 
     } 

参数

  • ****@local_variable
    变量的名称。变量名必须以 at 符 (
    @**) 开头。局部变量名必须符合有关标识符的规则。有关详细信息,请参阅使用标识符作为对象名称
  • data_type
    任何系统提供的公共语言运行时 (CLR) 用户定义类型或别名数据类型。变量不能是 textntextimage 数据类型。有关系统数据类型的详细信息,请参阅数据类型。有关 CLR 用户定义类型或别名数据类型的详细信息,请参阅 CREATE TYPE (Transact-SQL)
  • ****@cursor_variable_name
    游标变量的名称。游标变量名称必须以 at 符 (
    @**) 开头,并符合有关标识符的规则。
  • CURSOR
    指定变量是局部游标变量。
  • @table_variable_name
    table 类型的变量的名称。变量名称必须以 at 符 (@) 开头,并符合有关标识符的规则。
  • table_type_definition
    定义数据类型。表声明包括列定义、名称、数据类型和约束。允许的约束类型只包括 PRIMARY KEY、UNIQUE、NULL 和 CHECK。如果类型绑定了规则或默认定义,则不能将别名数据类型用作列标量数据类型。

    table_type_definition 是在 CREATE TABLE 中用于定义表的信息子集。其中包含了元素和主要定义。有关详细信息,请参阅 CREATE TABLE

  • n
    指示可以指定多个变量并对变量赋值的占位符。声明 table 变量时,table 变量必须是 DECLARE 语句中声明的唯一变量。
  • column_name
    表中的列的名称。
  • scalar_data_type
    指定列是标量数据类型。
  • computed_column_expression
    定义计算列值的表达式。计算列由同一表中的其他列通过表达式计算而得。例如,计算列可以定义为 cost AS price * qty。表达式可以是非计算列名称、常量、内置函数、变量,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询或用户定义函数。表达式不能引用 CLR 用户定义类型。
  • [COLLATE collation_name]
    指定列的排序规则。collation_name 可以是 Windows 排序规则名称或 SQL 排序规则名称,且只能用于 charvarchartextncharnvarcharntext 数据类型的列。如果未指定,则该列的排序规则是用户定义数据类型的排序规则(如果列为用户定义数据类型)或当前数据库的排序规则。

    有关 Windows 排序规则名称和 SQL 排序规则名称的详细信息,请参阅 COLLATE

  • DEFAULT
    如果在插入过程中未显式提供值,则指定为列提供的值。DEFAULT 定义可应用于任意列,但定义为 timestamp 或包含 IDENTITY 属性的列除外。删除表时,将删除 DEFAULT 定义。只有常量值(如字符串)、系统函数(如 SYSTEM_USER())或 NULL 可用作默认参数。为了与 SQL Server 的早期版本兼容,可以为 DEFAULT 分配约束名称。
  • constant_expression
    用作列的默认值的常量、NULL 或系统函数。
  • IDENTITY
    指示新列是标识列。在表中添加新行时,SQL Server 将为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。可以将 IDENTITY 属性分配给 tinyintsmallintintdecimal(p,0)numeric(p,0) 列。每个表只能创建一个标识列。不能对标识列使用绑定默认值和 DEFAULT 约束。必须同时指定种子和增量,或者都不指定。如果二者都未指定,则取默认值 (1,1)。
  • seed
    是装入表的第一行所使用的值。
  • increment
    添加到以前装载的列标识值的增量值。
  • ROWGUIDCOL
    指示新列是行的全局唯一标识符列。对于每个表,只能将其中的一个 uniqueidentifier 列指定为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能分配给 uniqueidentifier 列。
  • NULL | NOT NULL
    决定在列中是否允许空值的关键字。
  • PRIMARY KEY
    通过唯一索引对给定的一列或多列强制实现实体完整性的约束。每个表只能创建一个 PRIMARY KEY 约束。
  • UNIQUE
    通过唯一索引为给定的一列或多列提供实体完整性的约束。一个表可以有多个 UNIQUE 约束。
  • CHECK
    一个约束,该约束通过限制可输入一列或多列中的可能值来强制实现域完整性。
  • logical_expression
    返回 TRUE 或 FALSE 的逻辑表达式。

备注

变量常用在批处理或过程中,作为 WHILE、LOOP 或 IF...ELSE 块的计数器。

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

局部变量的作用域是其被声明时所在批处理。

当前分配有游标的游标变量可在下列语句中作为源引用:

  • CLOSE 语句。
  • DEALLOCATE 语句。
  • FETCH 语句。
  • OPEN 语句。
  • 定位的 DELETE 或 UPDATE 语句。
  • SET CURSOR 变量语句(在右侧)。

在所有上述语句中,如果存在引用的游标变量,但是不具有当前分配给它的游标,那么 Microsoft SQL Server 将引发错误。如果不存在引用的游标变量,SQL Server 将引发与其他类型的未声明变量引发的错误相同的错误。

游标变量值在声明游标后不发生更改。在 SQL Server 版本 6.5 以及更低版本中,每次重新打开游标时都会重新刷新变量值。

游标变量:

  • 可以是游标类型或其他游标变量的目标。有关详细信息,请参阅 SET @local\_variable
  • 如果当前没有给游标变量分配游标,则可在 EXECUTE 语句中作为输出游标参数的目标引用。
  • 应被看作是指向游标的指针。有关游标变量的详细信息,请参阅 Transact-SQL 游标

示例

A. 使用 DECLARE

以下示例将使用名为 @find 的局部变量检索所有姓氏以“Man”开头的联系人信息。

USE AdventureWorks;
GO
DECLARE @find varchar(30);
SET @find = 'Man%';
SELECT LastName, FirstName, Phone
FROM Person.Contact
WHERE LastName LIKE @find;

下面是结果集:

LastName            FirstName               Phone                     
-------------------------------------------------- -------------------------------------------------- ------------------------- 
Manchepalli         Ajay                    1 (11) 500 555-0174
Manek               Parul                   1 (11) 500 555-0146
Manzanares          Tomas                   1 (11) 500 555-0178
(3 row(s) affected)

B. 在 DECLARE 中使用两个变量

以下示例将检索北美销售领域中,年销售额至少有 $2,000,000 的 Adventure Works Cycles 销售代表的名字。

USE AdventureWorks;
GO
SET NOCOUNT ON;
GO
DECLARE @Group nvarchar(50), @Sales money;
SET @Group = N'North America';
SET @Sales = 2000000;
SET NOCOUNT OFF;
SELECT FirstName, LastName, SalesYTD
FROM Sales.vSalesPerson
WHERE TerritoryGroup = @Group and SalesYTD >= @Sales;

C. DELCARE 一个表类型的变量

以下示例将创建一个 table 变量,用于储存 UPDATE 语句的 OUTPUT 子句中指定的值。在它后面的两个 SELECT 语句返回 @MyTableVar 中的值以及 Employee 表中更新操作的结果。请注意,INSERTED.ModifiedDate 列中的结果与 Employee 表的 ModifiedDate 列中的值不同。这是因为对 Employee 表定义了 AFTER UPDATE 触发器,该触发器可以将 ModifiedDate 的值更新为当前日期。不过,从 OUTPUT 返回的列将反映触发器激发之前的数据。有关使用 OUTPUT 子句的更多示例,请参阅 OUTPUT 子句 (Transact-SQL)

USE AdventureWorks;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 
OUTPUT INSERTED.EmployeeID,
       DELETED.VacationHours,
       INSERTED.VacationHours,
       INSERTED.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

请参阅

参考

EXECUTE (Transact-SQL)
Functions (Transact-SQL)
SELECT (Transact-SQL)
表 (Transact-SQL)

其他资源

类型化与非类型化的 XML
修改用户定义类型变量和参数值

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2005 年 12 月 5 日

新增内容:
  • computed_column_expression 参数不能引用 CLR 用户定义类型。