平时写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='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语句来区分批处理的

IF 1=1
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用法相关推荐

  1. SQL中Truncate的用法

    转自:https://www.cnblogs.com/zhoufangcheng04050227/p/7991759.html 本文导读:删除表中的数据的方法有delete,truncate, 其中T ...

  2. 【SQL中limit的用法】

    SQL中limit的用法 说明:limit子句用于限制查询结果返回的数量,常用于分页查询. 用法:[select * from tableName limit i,n ] 参数:tableName: ...

  3. sql去重复操作详解SQL中distinct的用法

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 表B: 1.作用于单列 select dist ...

  4. PL/SQL中,declare定义变量和variable定义变量的区别?

    用declare声明的变量作用在block中. variable是sqlplus中定义变量的命令.他定义的变量在一个sqlplus连接中有效. SQL> show user USER 为&quo ...

  5. SQL中的limit用法

    limit用法 SQL中的limit函数是用来对数据库中的字段进行限制提取的,如:一个用户表中有许多的用户信息,如果想要取出其中某个位置的某几条数据,就可以使用limit函数. 结构 limit函数结 ...

  6. mysql declare 用法_SQL中的declare用法

    平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局 ...

  7. 教你学会Sql中 ROW_NUMBER的用法

    ROW_NUMBER SqlServer 2005 推出的新功能.语法:select *,ROW_Number() over(order by 字段) as '新列名' from table顾名思义: ...

  8. SQL中Case语句用法讨论

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  9. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

最新文章

  1. SAP HUM 锁住一个HU?
  2. 网络工程师求职与职业规划
  3. jQuery笔记---选择器
  4. [转帖]主流硬盘接口都有哪些?
  5. JS实例操作QQ空间自动点赞方法
  6. 一个好的技术团队应该怎么选择开发语言
  7. C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(下)
  8. Serv-U FTP Jail Break(越权遍历目录、下载任意文件)
  9. 信息系统项目管理通关指南
  10. FlashDevelop 3.0.0 Beta2 released
  11. intel网卡驱动下载linux,intel网卡驱动下载
  12. Java中的关键字有哪些?
  13. 一文带你了解 Java 中的锁
  14. 深度置信网络(DBN)
  15. dell i5-3567禁用触摸板和Fn多媒体快捷键
  16. 计算机如何解锁 磁盘,win7电脑磁盘被写保护如何解除,电脑磁盘被写保护解除方法...
  17. 白帽子黑客:手把手教你如何在Kali使用ibus拼音输入法?
  18. 小度加速破圈,智能音箱告别肉搏战
  19. 使用计算机能播放音乐也能观看视频,我电脑可以放歌有声音。怎么播放视频没声音啊?给我解决方案...
  20. 大一高数下册笔记整理_大学高等数学知识点整理(全)

热门文章

  1. 学习SEO就到SEOWHY,SEO十万个为什…
  2. time.h时间函数
  3. 《约伯记》注释正文 第十三章
  4. 众里寻他千百度,不如用它来搜库!
  5. Python Class 05-字符串
  6. MacBook Pro 触控栏不能正常使用怎么解决
  7. 【转】正则表达式 匹配中文,英文字母和数字及_的写法!同时控制长度
  8. GAN网络详解(从零入门)
  9. 2019年双十一购物数据分析报告
  10. xticklabel 显示下划线_[转载]matlab坐标轴属性及标注