CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我在存储过程里创建了一个临时表,主键约束PK_#t_BuildDataLostValue
然后我在存储过程里创建临时表代码后面的某个位置弄个非法语句,让它报错。然后重新执行它,就报错
说该约束PK_#t_BuildDataLostValue已经纯在!
难道临时表的消失不会伴随着约束的消失么。
如果不让存储过程主动报错的话,第二次执行存储过程就不会报错了。。
求解释下了高手
------解决思路----------------------
临时表消失,基于该表的所有东西都会消失,你创建临时表的时候,加上if exists(xxx)这样判断表是否存在。这样就可以反复执行。
------解决思路----------------------
我想知道你弄得什么非法语句

------解决思路----------------------
我也试了一下,我觉得它提示的信息更多的是告诉你表已经存在,因为我把约束注释掉执行的时候会报#t已经存在。你试一下在create table前面加上if exists来判断表是否存在。这样就不报错:
IF OBJECT_ID(N'tempdb..#t' ) IS NOT NULL
DROP TABLE #t
CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
------解决思路----------------------
得了解一下临时表的生存周期,应该不是想像的那样 --"当存储过程执行完毕后,系统回收临时表", 执行完毕是否就说明一个session结束了
------解决思路----------------------
这样写多session应用的时候当然有问题了,
在SQL Server中对于object来说是要求唯一不能重复的,不管是临时表还是约束,名称要求唯一。
因为用户定义object都存储在sys.objects中,主键约束PK作为object之一,存储在sys.objects中。
所以在创建临时表,定义类似主键约束,默认值等不需要指定特定的名称,不然会在多session调用时候报错。