变量是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. jQuery缓存数据

    很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如 1 2 3 4 <div data="some data">Test</div> < ...

  2. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

  3. 支付宝推AR实景红包,抢红包得拼脑力和体力

    近年春节,各大互联网平台都会借机掀起"红包大战",其中支付宝和微信的红包玩法备受用户关注.今年,微信尚未公布春节红包相关的方案信息,不过,今天支付宝率先推出"AR实景红包 ...

  4. 0421 & SX2016

    山西省选...这个省...不算强吧...然而就是这么腊鸡题目还是wa得一无是处...怎么办啊怎么办啊...无处拯救青春和未来啊... T1: POI2004原题 BZOJ1524 n<=16.这 ...

  5. linux shell basic command

    Learning basic Linux commands Command Description $ ls This command is used to check the contents of ...

  6. Linux内核补丁批量自动下载工具

    Linux kernel官网cgit工具不支持按变更代码进行补丁搜索,想到个办法就是把补丁都抓下来,这样可以在本地搜索.花了2个小时写了个小工具,话不多说,直接看效果: E:\docs\TOOLS\p ...

  7. topcoder SRM 628 DIV2 BishopMove

    题目比较简单. 注意看测试用例2,给的提示 Please note that this is the largest possible return value: whenever there is ...

  8. tornado学习笔记19 Tornado框架分析

    19.1 Http服务器请求处理流程图 (1) 调用HTTPServer的bind方法,绑定Socket的监听端口号: (2) 调用HTTPServer的listen方法,初始化一个listen so ...

  9. solr查询语句示例

    url示例:sort=id+desc&&fq=date_time:[20081001 TO 20091031]&wt=json&json.nl=map&q=st ...

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

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