平时写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的帮助里发现这么一句话,备注的第三行“局部变量的作用域是其被声明时所在批处理”

这行字在这么一大篇中还真挺不引人瞩目。

现在我们知道原来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 语句

mysql declare 用法_SQL中的declare用法相关推荐

  1. Java 中exists用法_SQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  2. java SQLexists用法_sql中的 exists 用法

    tablea aid aNAME 1 A1 2 A2 3 A3 tableb bID AID bNAME 1 1 B1 2 2 B2 3 2 B3 这是俩张表... select * from tab ...

  3. oracle mysql limit用法_sql中limit使用方法

    1.下面是几种limit的方法:原则看看下面几个例子应该就懂了 在数据库中很多地方都会用到,比如当你数据库查询记录有几万.几十万时使用limit查询效率非常快,只需要查询出你需要的数据就可以了·再也不 ...

  4. mysql raiserror_sql server数据库中raiserror函数用法的详细介绍

    sql server数据库中raiserror函数的用法 server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误 ...

  5. php中使用mysql的视图_MYSQL中视图的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于MYSQL中视图的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.什么是视图 执行一条SQL,将结果集保存在一张虚拟表中 (相关 ...

  6. mysql中去重的用法_mysql中去重 distinct 用法

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...

  7. mysql range用法_MySQL中Explain的用法总结(详细)

    本篇文章给大家带来的内容是关于MySQL中Explain的用法总结(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 执行计划(query Execution plan) 语法e ...

  8. mysql数据库 or的用法_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

  9. python中enumerate在for循环中用法_python中enumerate的用法实例解析

    在python中enumerate的用法多用于在for循环中得到计数,本文即以实例形式向大家展现python中enumerate的用法.具体如下: enumerate参数为可遍历的变量,如 字符串,列 ...

最新文章

  1. 强化学习(九)- 策略梯度方法 - 梯度上升,黑箱优化,REINFORCE算法及CartPole实例
  2. 大数据技术学习路线,有信心能坚持学习的朋友,从现在开始吧
  3. 【Android 安全】DEX 加密 ( Proguard 简介 | 默认 ProGuard 分析 )
  4. 【CV夏季划】2021年有三AI-CV夏季划出炉,冲刺秋招,从CV基础到模型优化彻底掌握...
  5. PMcaff O2O 产品峰会:行业最强干货,BAT总监级最佳实战 | 火热报名
  6. Hadoop技术之Hadoop HA 机制学习
  7. python学习-阶段训练(通讯录小练习)(增、删、改、查、还原)
  8. 计算机与应用化学怎么投稿,计算机与应用化学杂志
  9. 按钮点击打开新页面_PDF怎么打开?如何制作一个PDF格式的文档?
  10. load out mysql,快速的mysql导入导出数据(load data和outfile)
  11. (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
  12. 分布式定时任务调度系统技术解决方案(xxl-job、Elastic-job、Saturn)
  13. 21-7-28 git学习复习
  14. 我的世界服务器怎么修改标语,怎么用资源包修改我的世界闪烁标语
  15. GD32F103学习笔记(2)——在GD32F103移植STM32F103代码
  16. 思维拓展训练中的创新游戏设计
  17. std::decay 类型萃取
  18. NOIp 2020 微信步数 题解
  19. pyecharts各省人口GDP可视化分析
  20. PHP 连接sql server

热门文章

  1. 树莓派设置静态IP地址(有线网络)
  2. 写一份有卖点的英文履历
  3. 电脑双网卡设置不同网关(有线网卡+无线网卡)
  4. Python实现的进程管理神器——Supervisor
  5. 如何修改eclipse编辑器背景色
  6. 作为一个程序员需要学哪些技能
  7. 中国传媒大学计算机学院朱教授,中国传媒大学计算机学院林卫国副教授linwei@cuc.edu.cn.ppt...
  8. 蒙特卡洛树搜索算法(MCTS)
  9. 天翼云国产化全栈云服务 赋能数字中国建设
  10. rpm安装出现问题,提示lock