阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

简单介绍SQLserver中的declare变量用法

37次阅读
没有评论

共计 1271 个字符,预计需要花费 4 分钟才能阅读完成。

导读 这篇文章主要介绍了 SQLserver 中的 declare 变量用法,sql 中 declare 是声明的意思,就是声明变量的,这个一般是用在函数和存储过程中的。感兴趣的可以来了解一下

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

大家都知道 c# 中的局部变量,在 if 中如果我们定义一个变量的话他的作用到 if 结束为止,if 外是不识别这个变量的,else 里都不能使用,简单的写一下。

if(true)
{
Int32i=1;
Console.WriteLine(i);
}

这个 i 的作用域就是 if 里面,如果我们在 if 外面用这个变量

if(true)
{
Int32i=1;
Console.WriteLine(i);
}
Console.WriteLine(i);

那第二条输出语句会报错

The name 'i' does not exist in the current context

说明已经出了 i 的作用域了。

那么我们要是在 sql 写这么一段代码会是什么情况呢?首先写在 if 内

IF1=1
BEGIN
DECLARE@testVARCHAR
SET@test='1'
PRINT'inif:'+@test
END

运行看结果输出 in if:1 这是可以预想的结果。那我们在 if 外面使用变量 @test 试试。

IF1=1
BEGIN
DECLARE@testVARCHAR
SET@test='1'
PRINT'inif:'+@test
END
PRINT'outif:'+@test

这样会是什么结果呢,不知道大家怎么想的,以我的大脑顺势就想到这应该报错啊,出了变量的作用域了。实际结果不仅没报错而且 @test 的值还在。

in if:1

out if:1

看见这个结果当时我很郁闷,SQL 太出人意料了。

在 SQL SERVER 2005 的帮助文档里关于 declare 的帮助里发现这么一句话,备注的第三行“局部变量的作用域是其被声明时所在批处理”

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

现在我们知道原来 declare 变量的作用域是所在的批处理,if 阻断不了它的作用域,那上面我们的代码 if 内外的代码都在一个批处理中,所以 @test 都是可用的且 if 里面设置的值还在。

下面我改造一下代码,SQL 中是以 GO 语句来区分批处理的

IF1=1
BEGIN
DECLARE@testVARCHAR
SET@test='1'
PRINT'inif:'+@test
END
GO
PRINT'outif:'+@test

这下对了,检查语法后 SQL 报错“必须声明标量变量 ”@test””

注:GO 就是用于一个 sql 语句的结束 比如说一个批处理语句是这样的 select *from ,b select *from a 在后一个 select 后面加上一个 GO 这样可以一次执行两条 sql 语句

到此这篇关于 SQL server 中的 declare 变量用法的文章就介绍到这了。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1271字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中