当前位置: 代码迷 >> Sql Server >> SQL Server Management Studio总说大局临时表对象已存在
  详细解决方案

SQL Server Management Studio总说大局临时表对象已存在

热度:226   发布时间:2016-04-24 09:43:17.0
SQL Server Management Studio总说全局临时表对象已存在
我写了个简单的存储过程,目的是根据传进的参数创建相应的临时表结构用来存放一些数据,主要的SQL如下:

IF  EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'tempdb.dbo.##TMP_TABLE') AND type in (N'U'))
DROP TABLE ##TMP_TABLE;

IF @FLAG='A' OR @FLAG='C'
CREATE TABLE ##TMP_TABLE(id int, name VARCHAR(20));
ELSE
IF @FLAG='B'
CREATE TABLE ##TMP_TABLE(id int, name VARCHAR(20), class VARCHAR(5));



执行create procedure时竟然ELSE语句那通不过,说是##TMP_TABLE对象已经存在,真是无法理解啊,这不是条件判断,还没创建实际的临时表对象吗? SSMS这么弱智?有没有人遇到这种情况,还是说我不能这么写?
------解决思路----------------------
虽然直接用#或##这样的缺省tempdb.dbo的方式的也可以操作相应的临时表,但有时候却会脑残式的一直误判不给通过
你试着都加上完整的tempdb.dbo.试下~~
------解决思路----------------------
把全局临时表改为临时表或变表量实现
------解决思路----------------------
declare @FLAG VARChar(1);
IF @FLAG='A' OR @FLAG='C'
    select c1 as c1;
ELSE
IF @FLAG='B'
    select c2 as c2;
----------------------------------------
 这样可以编译通过

楼主写的创建表,其实改为临时表,也不能通过编译;

很期待哪位达人能解释一下
------解决思路----------------------
不讨论语法。
光看设计上有点别扭,全局临时表是拿来共享的,不应该频繁变动。
应该是固定3字段,然后分状态决定后面的操作是否使用class字段。
------解决思路----------------------
猜测是SQL Server语法分析的不正确,导致这种结果出来。我之前写.Net时,也偶尔会碰到类似这种情况,就是用人的逻辑肯定可以的,但电脑就是判断不行,报错。
在网上搜了一下,除非将数据库的兼容性改的很低才能保存。
  相关解决方案