Sql Server系列:Transact-SQL变量
变量是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变量的更多相关文章
- SQL Server系列之SQL Server 2016 中文企业版详细安装步骤(超多图)
1. 下载地址 下载地址 :https://www.microsoft.com/en-us/server-cloud/products/sql-server-2016/ 官方技术文档:https:// ...
- Sql Server系列:SQL语句查询数据库中表、视图、存储过程等组成
1. 查看用户表 select name from sys.tables select name from sys.objects where type='U' select name from sy ...
- SQL Server 临时表和表变量系列之选择篇
原文地址:https://yq.aliyun.com/articles/69187 摘要: # 摘要 通过前面的三篇系列文章,我们对临时表和表变量的概念.对比和认知误区已经有了非常全面的认识.其实,我 ...
- SQL Server 系列文章快速导航(SWF版)
一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...
- SQL Server系列目录
一.SQL Server基础部分 1 数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...
- 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 ...
- SQL Server系列文章目录
SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录
- SQL Server SSIS中的变量使用表达式后,就无法更改其值了
在SQL Server SSIS中,我们可以为变量定义初始值和表达式,其实SSIS的变量定义为表达式后我们就无法更改变量的值了,我们来做如下实验: 首先我们在SSIS包中定义一个String类型的变量 ...
- Sql Server系列:数据库组成及系统数据库
1. 数据库组成 数据库的存储结构分为逻辑存储结构和物理存储结构. ◊ 逻辑存储结构:说明数据库是由哪些性质的信息所组成.SQL Server的数据库不仅仅只是数据的存储,所有与数据处理操作相关的信息 ...
随机推荐
- Thisgood
this is good test print 'haha'
- 线程的Alertable与User APC
在使用插User APC注入DLL时,经常面临一个问题,那就是线程必须是处于Alertable模式才能注入成功.但一直对这个Alertable的含义不甚清楚,今天总算是把这个梗消化了. 微软对Aler ...
- Python之路【第三篇】python基础 之基本数据类型 补充
字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-310 ...
- gulp + webpack + sass 学习
笔记: new webpack.optimize.CommonsChunkPlugin 核心作用是抽离公共代码,chunks:['index.js','main.js'] 另一个作用就是单独生成一个j ...
- while(cin.eof)出错 poj
zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了 楼下的代码可以通过zoj #include<iostream> using namespace std; int main(){ ...
- Think in 递归
网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等.以前学生的时候,递归可以说一直是我的某种死穴,原理,细节我都懂,但是不管是在如何运用或者如何试试算法 ...
- 关于Delphi错误:Cannot make a visible window modal
Delphi的fsMDIChild类型的窗体是不能使用ShowModal的,否则会弹出"Cannot make a visible window modal"异常, 但是把fsMD ...
- shared_ptr
省去对象指针的显示delete typedef tr1::shared_ptr<int> IntPtr; IntPtr fun() { IntPtr p = new int(3); ret ...
- #IrrlichtEngine# Example1 HelloWorld
配置IDE环境来使用irrlicht引擎: (VS2012下)菜单栏项目 -> 项目属性窗口下 C/C++ -> 常规 -> 附加包含目录中添加irrlicnt引擎文件目录下incl ...
- openCV C++ 代码笔记
代码片段1 cv_contourMask_step_tmp=cv_contourMask.clone(); cv::Mat maskImage; UIImageToMat(pathimg, maskI ...