SQL SERVER中变量的定义、赋值与使用
本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识。
在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需要在SQL SERVER中对变量进行操作。
变量能进行的操作分定义、赋值、使用三种,下面以一段简短的代码作为示例:
--定义一个名称为@I的变量,指定其类型为整数
DECLARE
@I
INT
--对变量@I赋值为
SET
@I=3
--输出@I的值
SELECT
@I
这就是一个最简单的变量操作,包含上述全部三种类型。但变量能进行的操作远不止于此,下面分别进行描述:
变量声明:
变量声明的第一部分为关键字DECLARE,写在最前面。
变量声明的第二部分为变量名称,必须以@开头,后面可以跟字母、数字、中文和非系统运算符的字符,如@、$、_等。
变量声明的第三部分为变量类型,可以定义SQL SERVER中的所有常规类型,包括各种数字类型、字符串类型、时间类型等,只有极少数特殊数据类型无法在变量中定义。
·变量的三个部分用分隔符分开,分隔符可以由多个空格、TAB制表符、换行符组成。
·变量名称的大小写不区分,@A和@a指向同一个变量,不能重复定义。关键字和数据类型也是大小定不区分,含义相同。
·多个变量同时定义用逗号分隔多个变量名称和类型。如DECLARE @A INT,@B VARCHAR(50)。
·定义的变量的生命周期为同一批次或存储过程,即:在你运行的同一批语句(也就是运行时选择的所有语句)或存储过程中,定义的变量都可以使用,变量名称必须唯一。
下面给出常用的变量定义写法,以下变量的声明方式都是合法的:
DECLARE
@A
INT,@B
INT
--最常见的写法
SET
@A=1
--如果写SET @A='XX'会报错,因为XX是字符串且无法隐式转换为数字
SET
@A='23'
--用标量值函数赋值
SET
@A=DBO.FUN_1(@A)
--用子查询赋值
SET
@A=(SELECT
MAX(number)
FROM
MASTER..spt_values)
--用其它函数赋值
SET
@A=@B
--用表达式赋值
SET
@A=@B*5+DBO.FUN_1(@A)-(SELECT
MAX(number)
FROM
MASTER..spt_values)
变量赋值
变量的赋值有多种方式,最常见的方式是以下四种:
- SET赋值
对单个变量赋值可以使用SET,基本写法如下:
SET
@A='XYZ'需要注意的地方有:
·SET后的变量名称必须在本批次中已定义,大小写不限。
·=号后面可以写数字、字符、标量值函数、返回一行一列的子查询、其它变量、表达式等,但不能写存储过程。
·=号后返回的数据类型必须与变量的数据相同,或能隐式转换成变量的数据类型
·SET后的变量名称必须在本批次中已定义,大小写不限。
下面给出常见的SET赋值写法:
DECLARE
@A
INT,@B
INT--最常见的写法
SET
@A=1--如果写SET @A='XX'会报错,因为XX是字符串且无法隐式转换为数字
SET
@A='23'--用标量值函数赋值
SET
@A=DBO.FUN_1(@A)--用子查询赋值
SET
@A=(SELECT
MAX(number)
FROM
MASTER..spt_values)--用其它函数赋值
SET
@A=@B--用表达式赋值
SET
@A=@B*5+DBO.FUN_1(@A)-(SELECT
MAX(number)
FROM
MASTER..spt_values) - SELECT赋值
SELECT可以被认为是基于SET的强化赋值方式,以下写法与上面SET的基本写法完全等效:
SELECT
@A='XYZ'SELECT还可以对多个变量同时赋值:
SELECT
@A='XYZ',@B='CC'
SELECT还可以用查询的结果集对变量赋值:
SELECT
@A=NAME,@B=NAME+'X'
FROM
TB_CLASS
WHERE
NAME
LIKE
'%%'
- 输出参数赋值
在定义存储过程时可以将传入的参数设定为输出参数,然后在其中为其赋值。下面是一个简短的例子:
CREATE
PROCEDURE
PROC_TEST(@I
INT
OUTPUT)
AS
SET
@I=@I+1GO
DECLARE
@J
INTSET
@J=5EXEC
PROC_TEST
@J OUTPUTEXEC
PROC_TEST
@J OUTPUTSELECT
@J--7
需要注意的是在存储过程的定义中和执行存储过程的语句中,OUTPUT关键字都是必须的,不然无法返回参数。
- UPDATE赋值
UPDATE里除了可以给列赋新值,还能给变量赋值,这里就涉及到一些底层的知识和高级的用法,这里不多说,只看示例即可:
DECLARE
@I
INT
UPDATE
TB
SET
COL1='A',@I=1
UPDATE
TB
SET
COL1='B',@I=LEN(col1)
WHERE COL1 LIKE
'%%'
变量使用
变量可用的地方很多,在调试函数、存储过程、查询时都会用到,只要能用表达式的地方基本上都能用变量。以下是几个典型用法:
DECLARE
@I
INT
SET
@I=1
--直接输出变量
SELECT
@I
--使用变量调试函数
SELECT
DBO.FUN_TEST2(@I)
--使用变量作为存储过程的输入参数
EXEC
PROC_TEST
@I
--查询中使用变量
SELECT
*
FROM
TB
WHERE
COL1>@I
--更新中使用变量
UPDATE
TB
SET
COL1=@I
WHERE
COL1<>@I
以上就是变量使用的全部说明,希望能为读者带来帮助。
SQL SERVER中变量的定义、赋值与使用的更多相关文章
- [转] SQL Server中变量的声明和使用方法
原文地址 SQL Server中变量的声明和使用方法 声明局部变量语法: DECLARE @variable_name DataType 其中 variable_name为局部变量的名称,DataTy ...
- SQL Server中 SET 和 SELECT 赋值有什么区别?
SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT.对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种 ...
- SQL Server中变量的声明和使用方法
网址:http://blog.sina.com.cn/s/blog_63d0c97a0100qpy7.html 声明局部变量语法: DECLARE @variable_name DataType 其中 ...
- SQL Server中变量的声明和使用方法
声明局部变量语法:DECLARE @variable_name DataType其中 variable_name为局部变量的名称,DataType为数据类型.给局部变量赋值有两种方法:1.SET @v ...
- SQL SERVER中SELECT和SET赋值相同点与不同点
SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同. 1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是.这也是SET方式 ...
- Sql Server中变的定义以及赋值的应用
--申明变量declare @ad_begin datetimedeclare @fydl varchar(50)declare @userid varchar(50)declare @jdrbm v ...
- SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题
用户定义函数(UDF)分类 SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(T ...
- Sql server 浅谈用户定义表类型
1.1 简介 SQL Server 中,用户定义表类型是指用户所定义的表示表结构定义的类型.您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的 ...
- Sql Server数据库之流程定义变量和流程控制语句
一.局部变量和全局变量 1.声明局部变量 语法:declare @变量名 变量类型 2.给局部变量赋值 语法:set @变量名=值, select @变量名=值 区别:第一种方式用于普 ...
随机推荐
- 【JSP实例】指定用户计数器
不同的用户访问次数是不一样的,因此对于每一个用户的访问次数都要进行统计,以适应需要. 用户登陆的Login.html的源文件: <html> <head> <title& ...
- OpenSuSE查看指定软件包是否安装(OpenSuSE使用RPM作为默认的软件包维护管理工具)
suse 是 zypper se xxxxx 是搜索软件包 (查看已经安装的 软件包是否已经安装)
- API经济产业
技术大咖为我们铺好了前进道路,我们为什么还要敬而远之舍近索远呢?充分利用开源,利用API进行App有效整合. 为应用添加日志功能,Loggly; 为应用添加用户管理和身份认证模块,Stormpath; ...
- linux 启动 oracle数据库
第一步:切换到oracle用户 su - oracle 第二步:启动oracle数据库监听 lsnrctl start 第三步:输入下方命令,出现:sql> sqlplus /nolog 第四步 ...
- flex-linkbutton
LinkButton 控件是没有边框的 Button 控件,当用户将鼠标移动到该控件位置时,其内容将加亮显示.这些特征通常借助包含在浏览器页面中的 HTML 链接进行展示.为使 LinkButton ...
- Red5 1.0 RC1 与tomcat 6 整合
1.0以上版本没整合成功过,如有人整合成功过,也分享下,在此先谢谢 一.下载red5-1.0.0-RC1.zip 下载地址:http://code.google.com/p/red5/ 和http:/ ...
- #include <queue>
双端队列deque比向量vector更有优势 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque> 队列(queue) 先进先出的值的排列 <queue&g ...
- 济南最新公交线路一览(BRT)
济南最新公交线路一览(BRT) 济南BRT1路 高速公交线路 黄岗路东5:30-21:30 全福立交桥西5:30-21:30 票价1元,刷卡9折,月票有效 高速公交公司 去程:黄岗路东(BRT) - ...
- Time.deltaTime和Time.realtimeSinceStartup
private float f = 0f;void Update () { f += Time.deltaTime; Debug.LogError ("Time.delt ...
- plaidctf2015 ebp
很容易看出是格式化字符串漏洞.这里的格式化字符串漏洞不像传统的那样,格式化字符串是放在bss段中,并没放在栈上,因此利用起来有些困难. 不过,我们可以利用ebp,可以修改函数的ebp,从而能控制函数的 ...