首页 新闻 会员 周边

Sql语句拼接,内含临时表时,临时表无效问题

0
悬赏园豆:50 [已解决问题] 解决于 2014-07-02 12:26

不好描述,直接上代码

图片1

 

图片2:

 

问题:

根据图1写法,就会报错, 使用图2写法则没有问题

问题1:请问,同一个存储过程里面的语句,为什么图1会报错?

问题2:按照图1的写法逻辑,还有其他写法吗?

问题3:sql 语句的执行原理是什么? (这个问题提供资料就好)

袁家小黑球的主页 袁家小黑球 | 小虾三级 | 园豆:1045
提问于:2014-06-20 16:09
< >
分享
最佳答案
1

一个#号的临时表是事务级别的,就是说一个临时表只存在于一个事务里面。

1. 图1的写法 A和B属于两个不同的事务,所以会报错。而图2的写法是一个事务里面则成功执行。

2. 其他写法就是不用拼接SQL语句,直接写就行

    select * into #TempProducts from [dbo].[Sys_Product];

    select * from #TempProducts;

3. 一个#号的临时表是事务级别的,就是说一个临时表只存在于一个事务里面。

 

收获园豆:30
webaspx | 小虾三级 |园豆:1973 | 2014-06-20 16:32

 能提供一些关于事物的相关资料么?

我也是认为,由于exec的问题导致,A,B 2次执行不再一个事物里面

但是我有点奇怪,上面的所有语句我是放在存储过程里面的,难道存储过程里面多个语句的执行不在一个事物里面么?

袁家小黑球 | 园豆:1045 (小虾三级) | 2014-06-20 18:23

@袁家小黑球: 不好意思,没找到相关的资料。你可以新建个查询,把你的代码拷贝过去,执行就是了。一个查询中的代码就是一个事务里面的(不包括拼接的sql语句)。

就像下图A能执行而B执行失败一样的。

webaspx | 园豆:1973 (小虾三级) | 2014-06-23 09:46
其他回答(2)
0

上面的是因为执行2次SQL.而临时表一个执行完了就没了.

不用Exec,直接把SQL语句放外面,这样就在同一次sql执行了

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-20 16:30

  把图一  B语句的select放在外面,不拼接,也是访问不到#TempProducts的

支持(0) 反对(0) 袁家小黑球 | 园豆:1045 (小虾三级) | 2014-06-20 18:24
0

你多加一个#号就可以了 ##TempProducts,两个#号的表是放在tempdb里面的

收获园豆:15
Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-06-20 17:03

##是全局性质,不想这样使用

支持(0) 反对(0) 袁家小黑球 | 园豆:1045 (小虾三级) | 2014-06-20 18:21

@袁家小黑球: 那你用表变量呢,把数据放到表变量中。

declare @t1 table(t1 int)

支持(0) 反对(0) Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-06-25 18:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册