SQL中的declare用法
平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣。
大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下。
if (true)
{
Int32 i = 1;
Console.WriteLine(i);
}
这个i的作用域就是if里面,如果我们在if外面用这个变量
if (true)
{
Int32 i = 1;
Console.WriteLine(i);
}
Console.WriteLine(i);
那第二条输出语句会报错
The name 'i' does not exist in the current context
说明已经出了i的作用域了。
那么我们要是在sql写这么一段代码会是什么情况呢?首先写在if内
IF 1=1
BEGIN
DECLARE @test VARCHAR
SET @test='1'
PRINT 'in if:'+@test
END
运行看结果输出in if:1这是可以预想的结果。那我们在if外面使用变量@test试试。
IF 1=1
BEGIN
DECLARE @test VARCHAR
SET @test=''
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语句来区分批处理的
IF 1=1
BEGIN
DECLARE @test VARCHAR
SET @test=''
PRINT 'in if:'+@test
END
GO
PRINT 'out if:'+@test
SQL中的declare用法的更多相关文章
- SQL中distinct的用法
SQL中distinct的用法 1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...
- sql中binary_checksum(*)的用法
sql中binary_checksum(*)的用法(转) binary_checksum(*)可以用来检查修改过的行. 同一行在update后,该行的binary_checksum(*)就不同. 如 ...
- SQL中Merge的用法
SQL中Merge的用法 Merge的用法 Merge可以完成以下功能: 1. 两个表之间数据的更新 2. 进行进销存更新库存 3. 进行表之间数据的复制 语法说明: 1. 在语句结束后一定要 ...
- SQL中Truncate的用法(转)
转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所 ...
- sql中 decode() 的用法
sql中 decode() 的用法 SELECT ID,DECODE(inParam,'Param','value1' ,'value2') name FROM yytj2018 如果 inParam ...
- 十、SQL中EXISTS的用法 十三、sql server not exists
十.SQL中EXISTS的用法 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False EXISTS 指定一个子查询,检测 行 的存在. 语法 ...
- SQL中Truncate的用法
SQL中Truncate的用法转自:http://www.studyofnet.com/news/555.html本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE ...
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
- SQL中CASE 的用法 转载
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select getdat ...
随机推荐
- 课上实践练习——MySort
模拟实现Linux下Sort -t : -k 2的功能.参考 Sort的实现.提交码云链接和代码运行截图. Linux下Sort -t : -k 2的功能 sort的工作原理: sort将文件的每一行 ...
- 3060 抓住那头奶牛 USACO
3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它, ...
- docker error:/root/.docker/config.json: is a directory
问题: 本地没有taskworker镜像,docker从远端拉取,但是拉取时需要读取config.json配置,解析配置时,发现config.json是个目录,错误信息如下: taskworker_1 ...
- C#课后小作业
有关C#基础的练手 跟大家一起分享下 1.让用户输入一个100以内的数 打印1-100之间所有的数,用户输入的数除外 2.让用户输入一个100以内的数 打印1-这个数之间所有的数的和 3.使用一个fo ...
- Linux 防火墙设置(转)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- linux 下 python 安装 Django
安装 setuptools 使用easy_install命令 easy_install django
- python-将爬取到的m3u8合并为mp4
当你看到这个博客的时候恭喜你,你以后不用开vip就可以观看和下载vip视频了 最简单的观看vip视频步骤:进入全民解析网将vip视频地址进行解析 以下代码是通过python将vip视频进行下载为mp4 ...
- leetcode个人题解——#48 rotage image
思路:本题要求不能利用额外的二维数组实现旋转,所以重点在于弄清矩阵旋转的数学方法. 我的方法是,首先按照副对角线进行对称,然后按照水平中轴线进行对称即可. class Solution { publi ...
- java面向对象的有序数组和无序数组的比较
package aa; class Array{ //定义一个有序数组 private long[] a; //定义数组长度 private int nElems; //构造函数初始化 public ...
- VR产业链全景图