最后一贴,三个语句一起看就知道declare真相

guguda2008 2014-09-24 03:10:55
加精
if 'a'='b'
begin

DECLARE @t TABLE(i int)

insert into @t
select 1

create table #t(j int)
insert into #t
select 2


end

SELECT *
FROM @t
--输出空行
select *
from #t
--报错


if 1=2
declare @i int
else
set @i=1

select @i
--1


declare @i int 
select @i=1

while @i<4
begin

declare @j int
select @j=ISNULL(@j+1,1)

select @i=@i+1
end

select @i,@J
--4 3


三个语句一起看,就能搞清楚真相了。
while、if都是用的conditional迭代器,这个迭代器中如果涉及到变量声明,会放到迭代器之前运行,而不是按写好的逻辑顺序执行。因此上面三个语句等价于把语句中的declare拿到逻辑块之前执行,这么一改,就明了了:



DECLARE @t TABLE(i int)
if 'a'='b'
begin


insert into @t
select 1

create table #t(j int)
insert into #t
select 2


end

SELECT *
FROM @t
--输出空行
select *
from #t
--报错




declare @i int
if 1=2
PRINT '什么也不做,但不写点东西语句会报错'

else
set @i=1

select @i
--1


declare @i int 
select @i=1

declare @j int
while @i<4
begin

select @j=ISNULL(@j+1,1)

select @i=@i+1
end

select @i,@J
--4 3
...全文
1900 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
习惯性蹭分 2014-10-04
  • 打赏
  • 举报
回复
鸭子哥的最后一贴是啥意思啊,多来点这种贴子啊,
wayout99 2014-10-03
  • 打赏
  • 举报
回复

if 1=2
   select @i=1
else
   declare @i
這樣不行,是因為 declare @i 不是在 IF 這一個區塊內 的原因嗎? 謝謝!
beyondcj 2014-10-02
  • 打赏
  • 举报
回复
beyondcj 2014-09-29
  • 打赏
  • 举报
回复
java圈 2014-09-29
  • 打赏
  • 举报
回复
guguda2008 2014-09-28
  • 打赏
  • 举报
回复
引用 32 楼 lenovore 的回复:
declare @j int if 1=2 declare @i int=0 else set @j=1 select @i,@j 返回 NULL,1, 为什么不是0,1?
因为只有定义会执行。=0不是定义的一部分,而是赋值的快捷写法。
lenovore 2014-09-28
  • 打赏
  • 举报
回复
declare @j int if 1=2 declare @i int=0 else set @j=1 select @i,@j 返回 NULL,1, 为什么不是0,1?
tulip0022 2014-09-28
  • 打赏
  • 举报
回复
虽然看不懂,但是感觉好厉害的样子。 外贸女 VS IT男交友群:308708519
Neo_whl 2014-09-27
  • 打赏
  • 举报
回复
鸭子哥
jayzhihui 2014-09-26
  • 打赏
  • 举报
回复
受教受教······
guguda2008 2014-09-26
  • 打赏
  • 举报
回复
引用 26 楼 OrchidCat 的回复:
[quote=引用 17 楼 fredrickhu 的回复:] 我还是习惯在最前面一票的DECLARE 到后面好维护一点。
我也一样是最前面declare 。 但是有一个问题,没太明确。 如果declare是这种声明的方式,那么持有时间如果很长的话,他是怎么回收这块的资源呢? 还是目前就不回收了。微软默认存储过程事务都比较短,可以忽略这部分的资源重用? [/quote] 没必要回收 变更本身的定义基本不占内存空间,也不占任何锁,而无论哪种变量,只要赋值就受事务的控制。所以可以确定一个无值的变量对性能没有影响,就算事先声明好也没关系。
卖水果的net 版主 2014-09-26
  • 打赏
  • 举报
回复
在一个存储过程内部,不管从哪里定义一变量,从定义的那一行开始,就是一直可以使用,不存在回收的动作,直到过程执行结束,全部回收。 这和 LZ 的例子是一致的。 赞一下。
Mr_Nice 2014-09-26
  • 打赏
  • 举报
回复
引用 17 楼 fredrickhu 的回复:
我还是习惯在最前面一票的DECLARE 到后面好维护一点。
我也一样是最前面declare 。 但是有一个问题,没太明确。 如果declare是这种声明的方式,那么持有时间如果很长的话,他是怎么回收这块的资源呢? 还是目前就不回收了。微软默认存储过程事务都比较短,可以忽略这部分的资源重用?
imbbzg 2014-09-26
  • 打赏
  • 举报
回复
还是这里人多 有点事儿,能解决的技术大牛们多多啊
KeepSayingNo 2014-09-25
  • 打赏
  • 举报
回复
楼主研究得很深
laoer_2002 2014-09-25
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
厉害
sichuanwww 2014-09-25
  • 打赏
  • 举报
回复
lonelyk 2014-09-25
  • 打赏
  • 举报
回复
受教了..
Sidyhe 2014-09-25
  • 打赏
  • 举报
回复
加载更多回复(18)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧