SQL中的declare用法
平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣。
大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下。
{
Int32 i = 1;
Console.WriteLine(i);
}
这个i的作用域就是if里面,如果我们在if外面用这个变量
{
Int32 i = 1;
Console.WriteLine(i);
}
Console.WriteLine(i);
那第二条输出语句会报错
The name 'i' does not exist in the current context
说明已经出了i的作用域了。
那么我们要是在sql写这么一段代码会是什么情况呢?首先写在if内
BEGIN
DECLARE @test VARCHAR
SET @test='1'
PRINT 'in if:'+@test
END
运行看结果输出in if:1这是可以预想的结果。那我们在if外面使用变量@test试试。
BEGIN
DECLARE @test VARCHAR
SET @test='1'
PRINT 'in if:'+@test
END
PRINT 'out if:'+@test
这样会是什么结果呢,不知道大家怎么想的,以我的大脑顺势就想到这应该报错啊,出了变量的作用域了。实际结果不仅没报错而且@test的值还在。
in if:1
out if:1
看见这个结果当时我很郁闷,SQL太出人意料了。
在SQL SERVER 2005的帮助文档里关于declare的帮助里发现这么一句话,备注的第三行“局部变量的作用域是其被声明时所在批处理”
Msdn的地址:http://msdn.microsoft.com/zh-cn/library/ms188927.aspx
这行字在这么一大篇中还真挺不引人瞩目。
现在我们知道原来declare变量的作用域是所在的批处理,if阻断不了它的作用域,那上面我们的代码if内外的代码都在一个批处理中,所以@test都是可用的且if里面设置的值还在。
下面我改造一下代码,SQL中是以GO语句来区分批处理的
BEGIN
DECLARE @test VARCHAR
SET @test='1'
PRINT 'in if:'+@test
END
GO
PRINT 'out if:'+@test
这下对了,检查语法后SQL报错“必须声明标量变量"@test"”
注:GO就是用于一个sql语句的结束 比如说一个批处理语句是这样的 select *from ,b select *from a 在后一个select后面加上一个GO这样可以一次执行两条sql 语句
SQL中的declare用法相关推荐
- SQL中Truncate的用法
转自:https://www.cnblogs.com/zhoufangcheng04050227/p/7991759.html 本文导读:删除表中的数据的方法有delete,truncate, 其中T ...
- 【SQL中limit的用法】
SQL中limit的用法 说明:limit子句用于限制查询结果返回的数量,常用于分页查询. 用法:[select * from tableName limit i,n ] 参数:tableName: ...
- sql去重复操作详解SQL中distinct的用法
在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 表B: 1.作用于单列 select dist ...
- PL/SQL中,declare定义变量和variable定义变量的区别?
用declare声明的变量作用在block中. variable是sqlplus中定义变量的命令.他定义的变量在一个sqlplus连接中有效. SQL> show user USER 为&quo ...
- SQL中的limit用法
limit用法 SQL中的limit函数是用来对数据库中的字段进行限制提取的,如:一个用户表中有许多的用户信息,如果想要取出其中某个位置的某几条数据,就可以使用limit函数. 结构 limit函数结 ...
- mysql declare 用法_SQL中的declare用法
平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局 ...
- 教你学会Sql中 ROW_NUMBER的用法
ROW_NUMBER SqlServer 2005 推出的新功能.语法:select *,ROW_Number() over(order by 字段) as '新列名' from table顾名思义: ...
- SQL中Case语句用法讨论
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
最新文章
- SAP HUM 锁住一个HU?
- 网络工程师求职与职业规划
- jQuery笔记---选择器
- [转帖]主流硬盘接口都有哪些?
- JS实例操作QQ空间自动点赞方法
- 一个好的技术团队应该怎么选择开发语言
- C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(下)
- Serv-U FTP Jail Break(越权遍历目录、下载任意文件)
- 信息系统项目管理通关指南
- FlashDevelop 3.0.0 Beta2 released
- intel网卡驱动下载linux,intel网卡驱动下载
- Java中的关键字有哪些?
- 一文带你了解 Java 中的锁
- 深度置信网络(DBN)
- dell i5-3567禁用触摸板和Fn多媒体快捷键
- 计算机如何解锁 磁盘,win7电脑磁盘被写保护如何解除,电脑磁盘被写保护解除方法...
- 白帽子黑客:手把手教你如何在Kali使用ibus拼音输入法?
- 小度加速破圈,智能音箱告别肉搏战
- 使用计算机能播放音乐也能观看视频,我电脑可以放歌有声音。怎么播放视频没声音啊?给我解决方案...
- 大一高数下册笔记整理_大学高等数学知识点整理(全)