本文主要介绍声明变量在sqlserver中的使用。SQL中的declare是指声明一个变量,一般用在函数和存储过程中。有兴趣的可以过来了解一下。
SQL中的declare用法
平时写SQL查询和存储过程都是凭感觉。我没有探索过SQL的具体语法,但我总是用c#来模仿。前几天在项目中遇到一个问题,引起了我对declare定义的变量范围的兴趣。
我们都知道c#中的局部变量。如果我们在if中定义一个变量,它的作用将会一直到if结束。在IF之外不被识别,在else中也不能使用。简单写下来。
如果(真)
{
int 32 I=1;
控制台。WriteLine(I);
}
I的作用域在if内部,如果我们在if外部使用这个变量。
如果(真)
{
int 32 I=1;
控制台。WriteLine(I);
}
控制台。WriteLine(I);
第二条输出语句将报告一个错误。
名称“I”在当前上下文中不存在
I的范围已经指明。
那么如果我们用sql写这样的代码会怎么样呢?先把if写进去。
如果1=1
开始
声明@testVARCHAR
SET@test='1 '
打印' inif:' @测试
结束
看看if:1中的运行结果和输出。这是可以预见的结果。那么让我们尝试在if之外使用变量@test。
如果1=1
开始
声明@testVARCHAR
SET@test='1 '
打印' inif:' @测试
结束
打印' outif:' @test
这样的结果是什么?我不知道你怎么想的,但是我的大脑顺势而为,认为这应该报错,这不在变量的范围之内。实际结果不仅正确,而且@test的值还在。
在if:1中
out if:1
看到这个结果,我很沮丧。SQL太出乎意料了。
在SQL SERVER 2005的帮助文档中的declare的帮助中,找到了这句话。在第三行备注中,“局部变量的作用域是声明它们的批处理”。
Msdn地址:http://msdn.microsoft.com/zh-cn/library/ms188927.aspx
这一行在这么大的文章里,真的不引人注目。
现在我们知道了原始声明变量的作用域是它所在的批处理,if不能阻塞它的作用域。我们的代码if内部和外部的代码都在一个批处理中,所以@test是可用的,if中设置的值仍然在那里。
下面我来修改一下代码。在SQL中,GO语句用于区分批处理。
如果1=1
开始
声明@testVARCHAR
SET@test='1 '
打印' inif:' @测试
结束
去
打印' outif:' @test
没错,在检查语法之后,SQL报告了错误“必须声明标量变量' @test '”
注意:GO用在sql语句的末尾。比如一个批处理语句是这样的:select * from,b select * from a .在最后一个select后面加一个GO,这样可以一次执行两条sql语句。
关于在SQL server中使用声明变量的文章到此结束。有关在SQL server中声明变量的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。