变量是Transact-SQL中由用户定义、可对其赋值并参与运算的一个实体,分为全局变量和局部变量。其中全局变量由系统自定义并维护,全局变量名称前面有@@字符,任何程序均可随时调用。局部变量名称前面有一个@,由用户定义和使用。

1 局部变量

  局部变量一般出现在批处理、存储过程和触发器中,如果要使用局部变量,必须在使用前以DECLARE语句定义。局部变量仅存在于声明它的批处理、存储过程或触发器中,处理结束后,存储在局部变量中的信息将丢失。

1.1 局部变量声明

  在使用DECLARE语句来声明局部变量时,必须提供变量名称及数据类型,变量名称前面必须有一个@字符,变量名称最大长度为30个字符。声明变量时可以使用任何系统定义的数据类型或用户自定义的数据类型。

  DECLARE语法:

DECLARE { @variable_name datatype | [= value]} [,...n]

  参数:

  ◊ @variable_name:变量的名称。变量名必须以@开头。

  ◊ datatype:任何由系统提供的或用户定义的数据类型。变量数据类型不能是text、ntext或image。

  在SQL Server中,一次可以定义多个变量。

DECLARE @Name VARCHAR(50), @Age INT = 20

1.2 局部变量赋值

  变量声明后,变量值被默认设置为NULL。可以使用SET或SELECT语句为变量赋值,SET是为变量赋值的首选方法。

  语法格式:

SET @variable_name = expression
SELECT @variable_name = expression

  示例:

DECLARE @Name VARCHAR(50), @Age INT
SET @Name = 'Test'
SELECT @Age = 20 SELECT @Name, @Age
DECLARE @TotalRecords INT

SET @TotalRecords = (SELECT COUNT(1) FROM [dbo].[Product])
SELECT @TotalRecords = COUNT(1) FROM [dbo].[Product] SELECT @TotalRecords

  在局部变量没有被赋值之前,其值是NULL,如果要引用,特别是在循环结构中引用,必须先为其赋值。

DECLARE @Counter INT
SET @Counter = 1 WHILE @Counter <= 10
BEGIN
PRINT @Counter
SET @Counter = @Counter + 1
-- SELECT @Counter = @Counter + 1
END

  在SELECT语句的WHERE字句中使用变量:

DECLARE @ProductID INT
SET @ProductID = 1 SELECT * FROM [dbo].[Product] WHERE [ProductID] = @ProductID

  变量可以通过选择列表中当前所引用的值赋值,如果在选择列中引用变量,变量应被赋以标量值或者SELECT语句应仅返回一行。

DECLARE @MaxQuantity INT
SET @MaxQuantity = (SELECT MAX([Quantity]) FROM [dbo].[Product])
SELECT @MaxQuantity
DECLARE @MaxQuantity INT
SELECT @MaxQuantity = MAX([Quantity]) FROM [dbo].[Product]
SELECT @MaxQuantity

  如果SELECT语句返回多行而且变量引用一个非标量表达式,则变量被赋予为结果集最后一行中表达式的返回值。

DECLARE @ProductID INT
SELECT @ProductID = [ProductID] FROM [dbo].[Product]
SELECT @ProductID

  测试[dbo].[Product]表中有5条记录,执行结果为:5

DECLARE @ProductIDs VARCHAR(100)
SET @ProductIDs = ''
SELECT @ProductIDs += CONVERT(VARCHAR,[ProductID]) + ',' FROM [dbo].[Product]
SELECT @ProductIDs

  执行结果为:1,2,3,4,5,

1.3 Table类型变量

  Table类型的变量可以作为保存数据的临时表。

DECLARE @MyProduct TABLE
(
ProductID INT,
ProductName VARCHAR(100)
); INSERT INTO @MyProduct
SELECT [ProductID], [ProductName] FROM [dbo].[Product]
WHERE [UnitPrict] >= 10; SELECT * FROM @MyProduct;

2 全局变量

  全局变量用来跟踪服务器范围和特定会话期间的信息,不能显式被赋值。全局变量不能由用户定义。

Sql Server系列:Transact-SQL变量的更多相关文章

  1. SQL Server系列之SQL Server 2016 中文企业版详细安装步骤(超多图)

    1. 下载地址 下载地址 :https://www.microsoft.com/en-us/server-cloud/products/sql-server-2016/ 官方技术文档:https:// ...

  2. Sql Server系列:SQL语句查询数据库中表、视图、存储过程等组成

    1. 查看用户表 select name from sys.tables select name from sys.objects where type='U' select name from sy ...

  3. SQL Server 临时表和表变量系列之选择篇

    原文地址:https://yq.aliyun.com/articles/69187 摘要: # 摘要 通过前面的三篇系列文章,我们对临时表和表变量的概念.对比和认知误区已经有了非常全面的认识.其实,我 ...

  4. SQL Server 系列文章快速导航(SWF版)

    一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...

  5. SQL Server系列目录

    一.SQL Server基础部分 1  数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...

  6. Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程

    原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL S ...

  7. SQL Server系列文章目录

    SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录

  8. SQL Server SSIS中的变量使用表达式后,就无法更改其值了

    在SQL Server SSIS中,我们可以为变量定义初始值和表达式,其实SSIS的变量定义为表达式后我们就无法更改变量的值了,我们来做如下实验: 首先我们在SSIS包中定义一个String类型的变量 ...

  9. Sql Server系列:数据库组成及系统数据库

    1. 数据库组成 数据库的存储结构分为逻辑存储结构和物理存储结构. ◊ 逻辑存储结构:说明数据库是由哪些性质的信息所组成.SQL Server的数据库不仅仅只是数据的存储,所有与数据处理操作相关的信息 ...

随机推荐

  1. [翻译svg教程]Path元素 svg中最神奇的元素!

    先看一个实例 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999 ...

  2. bzoj1412最小割

    太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...

  3. Dictionary Learning(字典学习、稀疏表示以及其他)

    第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是稀疏字典学习(Sparse Di ...

  4. python RecursionError: maximum recursion depth exceeded in comparison错误

    处理快速排序,递归深度可能非常大,而系统默认的深度可能没有这么大 需要设置最大递归深度 import sys sys.setrecursionlimit(100000) # 这个值的大小取决你自己,最 ...

  5. S3C2440UART之FIFO

    一.基础知识 S3C2440有3个独立的串口,每一个都可以利用DMA和中断方式操作.每个包含2个64字节FIFO,一个收,一个发.非FIFO模式相当于FIFO模式的一个寄存器缓冲模式.每一个UART有 ...

  6. Mysql远程访问

    命令行: mysql -h 192.168.1.145 -u root -p 1.初始化root密码 进入mysql数据库 1mysql>update user set password=PAS ...

  7. 前端工具之-- Sublime

    开始学习前端知识,做一些笔记来记录下- 之前学习都是使用的dw 现在前端开发工具既轻便功能也够强大. 下面记录下常用的前端工具: Sublime3:需要安装第三方包,一般 Atom:继承度非常好 VS ...

  8. 站内全文检索服务来了,Xungle提供免费全文检索服务

    免费站内全文检索服务来了,是的,你没听错.全文检索相信大家已经不太陌生,主流检索服务有sphinx.xunsearch等,但这些都受服务器限制,对于中小站长尤其是没有服务器实现就困难了,随着数据量的增 ...

  9. SQl SGA 整理

    --查看诊断位置信息 select * from v$diag_info; --查看sga中内存分配信息 select * from sys.x$ksmfs; --查看内存块还剩余多少 select ...

  10. Linux 系统的初始化配置

      1.零时配置网卡IP地址 2.配置永久生效IP地址   需要进如 cd /etc/sysconfig/network-scripts  找到网卡文件编辑 3.零时主机名的更改. 4.永久主机名的更 ...