表变量问题

hml2007 2010-09-25 11:49:27
我在一个存储过程中的事务里面写了如下语句,将一个表中的数据插入到另一个表中,声明了一个表变量,可是通过表变量关联的插入语句没有成功,删除却成功了,导致没插入另一个表却把原来表里的数据删除了,怀疑表变量会不会有丢失的问题啊,不知道大家有没有碰到这样的情况

--申明一个表变量
DECLARE @ItemGUID TABLE(
VItemGUID UNIQUEIDENTIFIER
)
INSERT INTO @ItemGUID
SELECT [ItemGUID]
FROM [Basket_Item]
where UserID = @UserID

INSERT INTO [Receipt_Item]
(RGUID,
Rqty,
Rdate,
UserID
)
SELECT BGUID,
Bqty,
Bdate,
UserID
FROM [Basket_Item] pi inner join @ItemGUID temp
on pi.BGUID = temp.VItemGUID
--调用一个存储过程删除表 [Basket_Item]数据
exec DeleteBasket_Item @UserID
...全文
53 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
王向飞 2010-09-25
[Basket_Item] pi inner join @ItemGUID temp
on pi.BGUID = temp.VItemGUID 这个不一定会有数据啊。


INSERT INTO [Receipt_Item]
(RGUID,
Rqty,
Rdate,
UserID
)
SELECT BGUID,
Bqty,
Bdate,
UserID
FROM @ItemGUID temp 这种情况直接插入就好了
回复
hml2007 2010-09-25
而且这个现象不是老发生,偶尔发生,大部分时间都是能执行的很成功的,所以我就怀疑是不是表变量不稳定会丢失啊?
回复
hml2007 2010-09-25

而且你的脚本没有判断,也许
[Basket_Item] pi inner join @ItemGUID temp
on pi.BGUID = temp.VItemGUID
这个是没有结果的。

为什么会没有结果呢?我可以确定觉得有数据的

回复
hml2007 2010-09-25
我省略了部分,大家可以看看,写了事务,而且用表变量为了简化下面关联,后面还有好多表需要用到

BEGIN TRY
BEGIN TRAN
insert into Receipt (RGUIF,Date,UserID)
select BGUID,date,UserID
from Basket
where UserID = @UserID
--可以插入表Receipt数据
--申明一个表变量
DECLARE @ItemGUID TABLE(
VItemGUID UNIQUEIDENTIFIER
)
INSERT INTO @ItemGUID
SELECT [ItemGUID]
FROM [Basket_Item]
where BGUID in (select BGUID from Basket where UserID = @UserID)

INSERT INTO [Receipt_Item]
(RGUID,
Rqty,
Rdate,
UserID
)
SELECT BGUID,
Bqty,
Bdate,
UserID
FROM [Basket_Item] pi inner join @ItemGUID temp
on pi.BGUID = temp.VItemGUID
--没有插入表Basket_Item数据

--调用一个存储过程删除表 [Basket_Item]数据
exec DeleteBasket_Item @UserID
--删除Basket_Item表数据可以成功
COMMIT TRAN
END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN

END CATCH
回复
bancxc 2010-09-25
你这个过程中的表变量没必要啊
回复
jstoic 2010-09-25

养成好习惯.
使用 TRANSACTION

而且你的脚本没有判断,也许
[Basket_Item] pi inner join @ItemGUID temp
on pi.BGUID = temp.VItemGUID
这个是没有结果的。

回复
zsh0809 2010-09-25
 DECLARE  @ItemGUID  TABLE( 
VItemGUID UNIQUEIDENTIFIER
)
INSERT INTO @ItemGUID
SELECT [ItemGUID] ---先写死
FROM [Basket_Item]
where UserID = @UserID ---先写死id

执行select 看看有没有数据。


回复
ws_hgo 2010-09-25
create table #ItemGUID
(
VItemGUID UNIQUEIDENTIFIER
)
INSERT INTO #ItemGUID
SELECT [ItemGUID]
FROM [Basket_Item]
where UserID = @UserID

INSERT INTO [Receipt_Item]
(RGUID,
Rqty,
Rdate,
UserID
)
SELECT BGUID,
Bqty,
Bdate,
UserID
FROM [Basket_Item] pi inner join #ItemGUID temp
on pi.BGUID = temp.VItemGUID
--调用一个存储过程删除表 [Basket_Item]数据
exec DeleteBasket_Item @UserID
回复
ws_hgo 2010-09-25
你用临时表吧
回复
千面独行客 2010-09-25
下面这个是这个类型的变量的用法:

uniqueidentifier
全局唯一标识符 (GUID)。

注释
uniqueidentifier 数据类型的列或局部变量可用两种方法初始化为一个值:

使用 NEWID 函数。


将字符串常量转换为如下形式(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字)。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 uniqueidentifier 值。
比较运算符可与 uniqueidentifier 值一起使用。然而,排列并非通过比较两个值的位模式来实现。允许对 uniqueidentifier 值执行的操作只有比较 (=, <>, <, >, <=, >=) 和检查 NULL(IS NULL 和 IS NOT NULL)。不允许使用其它算术运算符。所有的列约束及属性(IDENTITY 除外)均允许用于 uniqueidentifier 数据类型。


你说的有时候不能够插入成功,看是不是值的格式不符合上面值类型的规定,所以不能够插入数据。
回复
千面独行客 2010-09-25
DECLARE @ItemGUID TABLE(
VItemGUID UNIQUEIDENTIFIER
)


你用UNIQUEIDENTIFIER 这个类型的变量做表变量做什么?这个一般是用来做列变量或者局部变量的。
如果你要定义表变量,直接用普通的字符串定义方法就可以了,用才Convert函数转换成表类型就可以了。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-09-25 11:49
社区公告
暂无公告