平时写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用法的更多相关文章

  1. SQL中distinct的用法

    SQL中distinct的用法   1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...

  2. sql中binary_checksum(*)的用法

    sql中binary_checksum(*)的用法(转) binary_checksum(*)可以用来检查修改过的行. 同一行在update后,该行的binary_checksum(*)就不同. 如 ...

  3. SQL中Merge的用法

    SQL中Merge的用法 Merge的用法 Merge可以完成以下功能: 1.  两个表之间数据的更新 2.  进行进销存更新库存 3.  进行表之间数据的复制 语法说明: 1.  在语句结束后一定要 ...

  4. SQL中Truncate的用法(转)

    转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所 ...

  5. sql中 decode() 的用法

    sql中 decode() 的用法 SELECT ID,DECODE(inParam,'Param','value1' ,'value2') name FROM yytj2018 如果 inParam ...

  6. 十、SQL中EXISTS的用法 十三、sql server not exists

    十.SQL中EXISTS的用法 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False EXISTS 指定一个子查询,检测 行 的存在. 语法 ...

  7. SQL中Truncate的用法

    SQL中Truncate的用法转自:http://www.studyofnet.com/news/555.html本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE ...

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

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

  9. SQL中CASE 的用法 转载

    sql语言中有没有类似C语言中的switch case的语句?? 没有,用case   when   来代替就行了.              例如,下面的语句显示中文年月 select getdat ...

随机推荐

  1. 20155220 2016-2017-2 《Java程序设计》第10周学习总结

    20155220 2016-2017-2 <Java程序设计>第10周学习总结 教材内容学习总结 计算机网络编程概述 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控 ...

  2. 20155302 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155302 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Jav ...

  3. 20155308 《Java程序设计》实验五 网络编程与安全

    20155308 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.ht ...

  4. 20155319 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile、myod

    20155319 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile.myod 测试2-gcc测试 1.用gcc 进行预处理,编译,汇编,链接vi输入的代码 2.生 ...

  5. 20155322 2017-2018-1《信息安全系统设计》第十周 课下作业-IPC

    20155322 2017-2018-1<信息安全系统设计>课下作业-IPC 作业内容 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接. 共享内存 管 ...

  6. python 多线程笔记(6)-- 生产者/消费者模式(续)

    用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import ...

  7. day1 创建X00001文件1K

    要求:创建文件名为:X000001-X999999,大小为1K 的文件 版本1) import os #1.输入要创建的文件数量 nums = int(input("nums:") ...

  8. 微信小程序:页面跳转时传递数据到另一个页面

    一.功能描述 页面跳转时,同时把当前页面的数据传递给跳转的目标页面,并在跳转后的目标页面进行展示 二.功能实现 1. 代码实现 test1页面 // pages/test1/test1.js Page ...

  9. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  10. lua 中的 loadfile、dofile和require的调用

    文件 hello.lua print("hello") function say() print("hello world") end 1. 介绍: dofil ...