允许用户创建游标, 用于在一个大的查询里面检索少数几行数据。
变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。游标变量可使用此语句声明,并可用于其他与游标相关的语句。除非在声明中提供值,否则声明之后所有变量将初始化为 NULL。
Transact-SQL 语法约定
语法
DECLARE
{
{{ @local_variable [AS] data_type } | [ = value ] }
| { @cursor_variable_name CURSOR }
} [,...n]
| { @table_variable_name [AS] <table_type_definition> | <user-defined table type> }
<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) 用户定义表类型或别名数据类型。变量的数据类型不能是 text、ntext 或 image。
有关系统数据类型的详细信息,请参阅数据类型 (Transact-SQL)。有关 CLR 用户定义类型或别名数据类型的详细信息,请参阅 CREATE TYPE (Transact-SQL)。
= value
以内联方式为变量赋值。值可以是常量或表达式,但它必须与变量声明类型匹配,或者可隐式转换为该类型。
@ cursor_variable_name
游标变量的名称。游标变量名称必须以 at 符 (@) 开头,并符合有关标识符的规则。
CURSOR
指定变量是局部游标变量。
@ table_variable_name
table 类型的变量的名称。变量名称必须以 at 符 (@) 开头,并符合有关标识符的规则。
<table_type_definition>
定义 table 数据类型。表声明包括列定义、名称、数据类型和约束。允许的约束类型只包括 PRIMARY KEY、UNIQUE、NULL 和 CHECK。如果类型绑定了规则或默认定义,则不能将别名数据类型用作列标量数据类型。
<table_type_definition> 是在 CREATE TABLE 中用于定义表的信息子集。其中包含了元素和主要定义。有关详细信息,请参阅 CREATE TABLE (Transact-SQL)。
n
指示可以指定多个变量并对变量赋值的占位符。声明 table 变量时,table 变量必须是 DECLARE 语句中声明的唯一变量。
column_name
表中的列的名称。
scalar_data_type
指定列是标量数据类型。
computed_column_expression
定义计算列值的表达式。计算列由同一表中的其他列通过表达式计算而得。例如,计算列可以定义为 cost AS price * qty。表达式可以是非计算列名称、常量、内置函数、变量,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询或用户定义函数。表达式不能引用 CLR 用户定义类型。
[ COLLATE collation_name ]
指定列的排序规则。collation_name 可以是 Windows 排序规则名称或 SQL 排序规则名称,并且只适用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型的列。如果未指定,则该列的排序规则是用户定义数据类型的排序规则(如果列为用户定义数据类型)或当前数据库的排序规则。
有关 Windows 排序规则名称和 SQL 排序规则名称的详细信息,请参阅 COLLATE (Transact-SQL)。
DEFAULT
如果在插入过程中未显式提供值,则指定为列提供的值。DEFAULT 定义可适用于除定义为 timestamp 或带 IDENTITY 属性的列以外的任何列。删除表时,将删除 DEFAULT 定义。只有常量值(如字符串)、系统函数(如 SYSTEM_USER())或 NULL 可用作默认参数。为了与 SQL Server 的早期版本兼容,可以为 DEFAULT 分配约束名称。
constant_expression
用作列的默认值的常量、NULL 或系统函数。
IDENTITY
指示新列是标识列。在表中添加新行时,SQL Server 将为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。可以将 IDENTITY 属性分配给 tinyint、smallint、int、decimal(p,0) 或 numeric(p,0) 列。每个表只能创建一个标识列。不能对标识列使用绑定默认值和 DEFAULT 约束。必须同时指定种子和增量,或者都不指定。如果二者都未指定,则取默认值 (1,1)。
seed
是装入表的第一行所使用的值。
increment
添加到以前装载的列标识值的增量值。
ROWGUIDCOL
指示新列是行的全局唯一标识符列。对于每个表,只能将其中的一个 uniqueidentifier 列指定为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能分配给 uniqueidentifier 列。
NULL | NOT NULL
决定在列中是否允许 Null 值的关键字。
PRIMARY KEY
通过唯一索引对给定的一列或多列强制实现实体完整性的约束。每个表只能创建一个 PRIMARY KEY 约束。
UNIQUE
通过唯一索引为给定的一列或多列提供实体完整性的约束。一个表可以有多个 UNIQUE 约束。
CHECK
一个约束,该约束通过限制可输入一列或多列中的可能值来强制实现域完整性。
logical_expression
返回 TRUE 或 FALSE 的逻辑表达式。
<<user-defined table type>>
指定变量是用户定义表类型。
备注
变量常用在批处理或过程中,作为 WHILE、LOOP 或 IF...ELSE 块的计数器。
变量只能用在表达式中,不能代替对象名或关键字。若要构造动态 SQL 语句,请使用 EXECUTE。
局部变量的作用域是其被声明时所在批处理。
当前分配有游标的游标变量可在下列语句中作为源引用:
* CLOSE 语句。
* DEALLOCATE 语句。
* FETCH 语句。
* OPEN 语句。
* 定位的 DELETE 或 UPDATE 语句。
* SET CURSOR 变量语句(在右侧)。
在所有上述语句中,如果存在被引用的游标变量,但是不具有当前分配给它的游标,那么 SQL Server 将引发错误。如果不存在被引用的游标变量,SQL Server 将引发与其他类型的未声明变量引发的错误相同的错误。
游标变量:
* 可以是游标类型或其他游标变量的目标。有关详细信息,请参阅 SET @local_variable (Transact-SQL)。
* 如果当前没有给游标变量分配游标,则可在 EXECUTE 语句中作为输出游标参数的目标引用。
* 应被看作是指向游标的指针。有关游标变量的详细信息,请参阅 Transact-SQL 游标。
示例
A. 使用 DECLARE
下例将使用名为 @find 的局部变量检索所有姓氏以 Man 开头的联系人信息。
复制代码
USE AdventureWorks;
GO
DECLARE @find varchar(30);
/* Also allowed:
DECLARE @find varchar(30) = 'Man%';
*/
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. 声明一个表类型的变量
下例将创建一个 table 变量,用于储存 UPDATE 语句的 OUTPUT 子句中指定的值。在它后面的两个 SELECT 语句返回 @MyTableVar 中的值以及 Employee 表中更新操作的结果。请注意,INSERTED.ModifiedDate 列中的结果与 Employee 表的 ModifiedDate 列中的值不同。这是因为对 Employee 表定义了 AFTER UPDATE 触发器,该触发器可以将 ModifiedDate 的值更新为当前日期。不过,从 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
D. 声明一个用户定义表类型的变量
下例将创建一个名为 @LocationTVP 的表值参数或表变量。这需要使用一个相应的名为 LocationTableType 的用户定义表类型。有关如何创建用户定义表类型的详细信息,请参阅 CREATE TYPE (Transact-SQL)。有关表值参数的详细信息,请参阅表值参数(数据库引擎)。
复制代码
DECLARE @LocationTVP
AS LocationTableType;
相关推荐
与C#等编程语言不同,SQL中的变量管理有着自己的规则,特别是关于作用域和生命周期的概念。 在C#中,变量的作用域通常局限于定义它的代码块,例如一个函数或条件语句(如`if`或`else`)。一旦离开这个代码块,变量...
SQL Server 动态 SQL 语句的用法 SQL Server 中的动态 SQL 语句是一种灵活的查询方式,它可以根据不同的情况生成不同的 SQL 语句。动态 SQL 语句可以用来实现复杂的业务逻辑,提高查询效率和灵活性。 普通 SQL ...
SQL Server中的自定义函数是数据库开发中非常重要的组成部分,它们允许开发者创建自定义的逻辑,以便在查询中重用和简化复杂操作。本篇主要关注SQL Server 2008中的三种自定义函数:标量函数、内联表值函数和多语句...
本文档提供了一套全面的SQL语句及其用法,适用于MySQL、Oracle和SQL Server等主流数据库系统。这些SQL语句覆盖了数据操作、数据定义、数据控制以及事务控制等多个方面。 #### 二、数据操作 ##### SELECT - **用途*...
Declare 关键字在 TypeScript 中的正确使用 Declare 关键字是 TypeScript 中的一个重要关键字,用于声明变量、函数、类等类型。正确使用 Declare 关键字可以帮助开发者编写更加可读、可维护的代码。下面是Declare ...
在 PL/SQL 中,numeric(p,s) 和 decimal(p,s) 的作用相同,但是它也可以使用 NUMBER(p,s) 来定义数字类型。 char(m) 在 T-SQL 中用于定义一个固定长度的字符串类型,例如 char(10) 定义了一个长度为 10 的字符串...
在SQL Server中,执行动态SQL或存储过程时,开发人员通常面临选择使用`EXEC`还是`sp_executesql`的问题。这两种方法虽然都能达到目的,但在功能、性能及安全性等方面存在显著差异。本文将详细介绍这两者的区别,并...
本篇文章将深入探讨SQL语句的一些妙用和详细用法,包括动态SQL、输出参数、Identity列的管理以及通用的SQL查询技巧。 1. 动态SQL: 动态SQL允许我们在运行时构建和执行SQL语句,这在处理动态生成的查询或变量作为...
2. FOR循环:通常用于遍历一个范围内的数字或集合,比如在PL/SQL中的FOR IN循环。 二、WHILE循环 WHILE循环在PL/SQL和T-SQL中都有使用。下面是一个简单的示例: ```sql DECLARE i NUMBER := 1; -- 初始化变量 ...
在 SqlServer 中,使用 declare 语句来定义游标,而在 MySql 中,使用 declare 语句来定义游标,但是它们之间有所不同。在 MySql 中,需要使用 declare 语句来定义游标变量,然后使用 open 语句来打开游标,fetch ...
### SQL语句妙用指导——SQL的便捷及巧妙用法详解 #### 一、动态SQL语句基础 在SQL编程中,动态SQL是指在运行时根据条件构建的SQL语句。这种方式非常灵活,尤其适用于需要根据不同的输入动态生成查询的情况。 **1...
在SQL Server中,游标是一种重要的工具,它允许我们逐行处理查询结果集,而不仅仅是一次性获取所有数据。游标提供了在结果集中向前或向后移动的能力,这在某些复杂的数据处理任务中非常有用。本篇文章将深入探讨SQL ...
SQL_EXEC 命令用法详解 SQL_EXEC 命令是一种重要的 SQL 语句,它可以执行存储过程或动态批次。动态批次是一个内容为 SQL 语句的字符串。例如,以下代码将执行一个 select 语句: declare @schemaName varchar(80),...
在SQL SERVER 2000中进行简繁体转换是一个重要的功能,特别是在处理中文数据时。这个过程涉及到数据库设计和自定义函数的创建,以便在数据库中实现字符集的转换。下面将详细介绍如何在SQL SERVER 2000中执行简繁体...
在SQL Server中,查询语句是否可以使用变量来表示表名是一个常见的疑问,尤其是在编写动态SQL时。在SQL Server中,确实可以通过变量来构建动态的表名,但这需要借助存储过程或者动态SQL来实现。这是因为SQL语句在...
在Oracle数据库环境中,动态SQL(Dynamic SQL)是一种强大的技术,允许在运行时构建和执行SQL语句。这种技术尤其适用于那些在程序执行前无法预知具体SQL结构的情况,例如,当查询条件根据用户输入或者程序运行状态...
SQL Server Broker(SQL Service Broker,简称SSB)是微软在SQL Server中提供的一种异步消息队列技术,用于实现数据库间的可靠通信和异步处理。它允许数据库应用程序发送和接收消息,提供了高可用性、安全性和可扩展...
在SQL Server中,动态SQL是一种强大而灵活的工具,允许开发人员根据运行时条件构建并执行SQL查询。本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意...
1. **DECLARE** - 声明变量,用于在SQL脚本中存储值。 2. **EXPLAIN** - 描述查询的执行计划,帮助优化查询性能。 3. **OPEN** - 打开游标,用于迭代查询结果。 4. **FETCH** - 从游标中获取一行数据。 5. **CLOSE**...
静态SQL是指在PL/SQL中直接运行的SQL语句,没有什么特别之处。动态SQL则是指利用EXECUTE IMMEDIATE语句执行的SQL语句,这种方式可以在运行时动态生成SQL语句的内容。 一、静态SQL 静态SQL是指在PL/SQL中直接运行的...