Transact-SQL 参考

DECLARE @local_variable

在批处理或过程的正文中用 DECLARE 语句声明变量,并用 SET 或 SELECT 语句给其指派值。游标变量可通过该语句声明,并且可用在其它与游标相关的语句中。所有变量在声明后均初始化为 NULL。

语法

DECLARE
    {{ @local_variable data_type }
        | { @cursor_variable_name CURSOR }
        | { table_type_definition }
    } [ ,...n]

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

< column_definition > ::=
    column_name scalar_data_type
    [ 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

是任何由系统提供的或用户定义的数据类型。变量不能是 textntextimage 数据类型。有关系统数据类型的更多信息,请参见数据类型。有关用户定义数据类型的更多信息,请参见 sp_addtype

@cursor_variable_name

是游标变量的名称。游标变量名必须以 at 符 (@) 开头并遵从标识符规则。

CURSOR

指定变量是局部游标变量。

table_type_definition

定义表数据类型。表声明包括列定义、名称、数据类型和约束。允许的约束类型只包括 PRIMARY KEY、UNIQUE KEY、NULL 和 CHECK。

table_type_definition 是在 CREATE TABLE 中用于定义表的信息子集。元素和基本定义都包含在该定义中;有关更多信息,请参见 CREATE TABLE

n

是表示可以指定多个变量并对变量赋值的占位符。当声明表变量时,表变量必须是 DECLARE 语句中正在声明的唯一变量。

column_name

是表中的列名。

scalar_data_type

指定列是标量数据类型。

[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。

局部变量的作用域是在其中声明局部变量的批处理、存储过程或语句块。有关在语句块内使用局部变量的更多信息,请参见使用 BEGIN...END

当前给其指派有游标的游标变量可在下列语句中作为源引用:

在所有这些语句中,如果引用的游标变量存在,但是不具有当前分配给它的游标,那么 Microsoft® SQL Server™ 会产生错误。如果引用的游标变量不存在,SQL Server 将产生对另外一类未声明变量所产生的相同错误。

游标变量:

示例
A. 使用 DECLARE

下例使用名为 @find 的局部变量检索所有姓以 Ring 开头的作者信息。

USE pubs
DECLARE @find varchar(30)
SET @find = 'Ring%'
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE @find

下面是结果集:

au_lname                               au_fname             phone        
-------------------------------------- -------------------- ------------ 
Ringer                                 Anne                 801 826-0752 
Ringer                                 Albert               801 826-0752 

(2 row(s) affected)
B. 在 DECLARE 中使用两个变量

下例从 Binnet & Hardley (pub_id = 0877) 的雇员中检索从 1993 年 1 月 1 日起所雇佣的雇员名称。

USE pubs
SET NOCOUNT ON
GO
DECLARE @pub_id char(4), @hire_date datetime
SET @pub_id = '0877'
SET @hire_date = '1/01/93'
-- Here is the SELECT statement syntax to assign values to two local 
-- variables.
-- SELECT @pub_id = '0877', @hire_date = '1/01/93'
SET NOCOUNT OFF
SELECT fname, lname
FROM employee
WHERE pub_id = @pub_id and hire_date >= @hire_date

下面是结果集:

fname                lname                          
-------------------- ------------------------------ 
Anabela              Domingues                      
Paul                 Henriot                        

(2 row(s) affected)

请参见

EXECUTE

函数

SELECT

table