首页 > 数据库 >SQL中的declare用法

SQL中的declare用法

时间:2024-07-25 16:28:53浏览次数:17  
标签:变量 作用域 用法 PRINT SQL test declare

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='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
复制代码

 

标签:变量,作用域,用法,PRINT,SQL,test,declare
From: https://www.cnblogs.com/chewen/p/18323507

相关文章

  • 求教Postgresql在jdbc处理bit(1)字段的预处理解决方案
    文章目录1.建表语句:2.使用以下方式的预处理方式都报错了3.可以先用sql拼接实现功能1.建表语句:CREATETABLEpublic.h_user( idserial4notnull, usernamevarchar(50)NULL, "password"varchar(64)NULL, nicknamevarchar(60)NULL, emailvarchar(255)N......
  • MySQL 学习笔记 进阶(存储引擎,索引上)
    存储引擎 存储引擎-MySQL体系结构连接层服务层引擎层存储层 存储引擎-简介简介:存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被成为表类型。在创建表时,指定存储引擎CREATETABLE表名(......
  • 第九讲: MySQL为什么有时候会选错索引?
    第九讲:MySQL为什么有时候会选错索引?​ 前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的。​ 但是,你写SQL语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由MySQL来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快......
  • MySQL篇
    一、定位慢查询定位慢查询很简单,主要有以下方式:通过运维工具分析开启mysql慢日志在mysql的配置文件/etc/my.cnf中配置并开启慢日志功能#开启MySQL慢日志查询开关slow_query_log=1#设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志long_quer......
  • mysql常用语法
    MySQL约束注释--单行注释/*多行注释*/#井号注释MySQL命令执行顺序FROM>ON>JOINWHERE>GROUPBY>HAVING+聚合函数>SELECT>ORDERBY>LIMIT数据库设计——DDLshowdatabases; --查看当前所有的数据库use[数据库名]; --打开指定的数据库showtab......
  • lazarus使用unidac+sqlite,用dbgrid显示float字段时遇到的问题
    遇到的问题:网友海使用过程发现,lazarus使用unidac+sqlite,用dbgrid显示float字段时遇到数据库的字段内容明明有多位小数,但在dbgrid只显示1位小数和截图最后1行显示1.1E2等问题。 在Navicat显示的表内容:这是他的解决方法: 修改UniConnection1的DataTypeMapping,将float映射为s......
  • Rust 中 *、&、mut、&mut、ref、ref mut 的用法和区别
    Rust中*、&、mut、&mut、ref、refmut的用法和区别在Rust中,*、ref、mut、&和refmut是用于处理引用、解引用和可变性的关键字和操作符,它们在不同的上下文中有不同的用法。一、*解引用*属于操作符1.作用用于解引用指针或引用,以访问其指向的值。通过解引用,可以从指......
  • Mysql常用函数
    1、FIND_IN_SETFIND_IN_SET()是一个MySQL中的字符串函数,用于在一个由逗号分隔的字符串列表中查找指定字符串的位置。如果找到了指定的字符串,FIND_IN_SET()将返回该字符串在列表中的位置(索引值)。如果没有找到,它将返回0。其语法如下:FIND_IN_SET(str,strlist)str:......
  • CTFHUB-SQL注入-1
    对于sql注入类型的题,首先判断注入点尝试发现注入点为?id=1'发现联合注入无法回显,尝试使用sqlmap先进行扫描sqlmap-u"http://challenge-1559e706c24187fa.sandbox.ctfhub.com:10800/?id=1'" 查询dbssqlmap-u"http://challenge-1559e706c24187fa.sandbox.ctfhub.co......
  • leetcode 1555 银行账号概要(postgresql)
    需求用户表:Users±-------------±--------+|ColumnName|Type|±-------------±--------+|user_id|int||user_name|varchar||credit|int|±-------------±--------+user_id是这个表的主键。表中的每一列包含每一个用户当前的额度信息。交易......