变量是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. 手把手教你搭建深度学习平台——避坑安装theano+CUDA

    python有多混乱我就不多说了.这个混论不仅是指整个python市场混乱,更混乱的还有python的各种附加依赖包.为了一劳永逸解决python的各种依赖包对深度学习造成的影响,本文中采用pytho ...

  2. 第一章 DeepLab的创作动机

    这一段时间一直在做深度学习方面的研究,目前市场上的深度学习工具主要分为两大块.一块是基于Python语言的theano:另一块是可以在多个语言上使用并能够在GPU和CPU之间随意切换的Caffe.但是 ...

  3. Linux系统编程之IO_缓冲和非缓冲

    下面是一段类似日志记录的代码,已获取通讯的报文内容和当时的环境参数内容,就是创建一个文件,使用标准IO的fopen.fprintf进行输出记录.但是在调试中,刚开始我就傻眼了,文件创建成功了,但是实时 ...

  4. 关于js单线程(转载)

    进程和线程都是操作系统的概念.进程是应用程序的执行实例,每一个进程都是由私有的虚拟地址空间.代码.数据和其它系统资源所组成:进程在运行过程中能够申请创建和使用系统资源(如独立的内存区域等),这些资源也 ...

  5. keepalived 原主上线时vip漂移情况

    1. 设置为MASTER,BACKUP 优先级相同 的情况: master端的keepalived起来就会获取到vip变成主. 2. 设置为BACKUP,BACKUP 一个优先级高一个优先级低 的情况 ...

  6. PHP去重算法的优化过程

    最近公司在做一个项目,需要对爬取到的数据进行去重,方法就是根据数据的id,去除掉id重复的数据. 下面是这个方法的演化过程. // 去重 $arr_id = array(); $LeTVFeedLis ...

  7. svg格式的中国地图轮廓图

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C ...

  8. 对 griview获取的数据添加方法 6月

    <asp:TemplateField HeaderText="日期">                            <HeaderStyle CssCl ...

  9. ASP.NET Aries 开源开发框架:开发指南(一)

    前言: 上周开源了Aries开发框架后,好多朋友都Download了源码,在运行过程里,有一些共性的问题会问到. 所以本篇打算写一下简单的开发指南,照顾一下不是太看的懂源码的同学,同时也会讲解一下框架 ...

  10. ABP理论学习之模块系统

    返回总目录 本篇目录 模块介绍 生命周期事件 模块依赖 自定义模块方法 模块介绍 ABP提供了构建模块并将这些模块组合起来创建应用的基础设施.一个模块可以依赖另一个模块.一般来说,一个程序集可以认为是 ...