存储过程删除查询

5

我有一个存储过程:

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE]

@cartGUID nvarchar

AS

DELETE FROM
  [dbo].[k_ShoppingCart]
WHERE
  CartGUID = @cartGUID

当我执行这个操作时,
exec dbo.k_ShoppingCart_DELETE '32390b5b-a35a-4e32-8393-67d5629192f0'

结果:0行受影响。

但是,当我尝试这个查询时:

Delete FROM k_ShoppingCart Where CartGUID = '32390b5b-a35a-4e32-8393-67d5629192f0'

结果: 影响了2行。

这有什么问题吗?


您似乎没有为@cartGUID指定大小。我认为您需要指定一个大小。 - Russ Cam
7个回答

4
如果您坚持使用NVARCHAR而不是UNIQUEIDENTIFIER,您需要指定大小:
@cartGUID nvarchar(36)

如果没有它,你的GUID会被截断(最多只有30个字符)。

通过运行修改后的工作查询,您可以确认此行为:

DECLARE @cart nvarchar, @sizedcart nvarchar(36)
SET @cart      = '32390b5b-a35a-4e32-8393-67d5629192f0'
SET @sizedcart = '32390b5b-a35a-4e32-8393-67d5629192f0'

-- works
Delete FROM k_ShoppingCart Where CartGUID = '32390b5b-a35a-4e32-8393-67d5629192f0'

-- will not work
Delete FROM k_ShoppingCart Where CartGUID = @cart

-- should work
Delete FROM k_ShoppingCart Where CartGUID = @sizedcart

我同意@Marc Gravell的观点,使用唯一标识符是解决这个问题的最佳方式。


3

在IT技术方面,是否将@cartGUID作为uniqueidentifier比作为nvarchar更好?将单个varchar强制转换为guid并比较guid比将所有guid强制转换为varchar要更高效,并且希望它使用相同的格式(否则相等性将无法实现)。

正如其他人指出的那样,WHERE子句看起来很奇怪,但我认为varchar转换是罪魁祸首。


我同意,尝试将@cartGUID更改为uniqueidentifier,并且CartGUID列的类型也应该是uniqueidentifier。 - Saif Khan

0

你存储过程末尾的那个IN语句是什么意思?看起来没有任何意义。建议你把它删掉。此外,在查询和存储过程中,给所有表加上"dbo"前缀(谁知道你的默认模式中是否有同名的表)。这两件事情应该就可以解决问题了。


0

我不认为你在多个模式下有相同的表...

dbo.k_ShoppingCart

vs.

user1.k_ShoppingCart

该存储过程使用 "dbo",而临时查询使用当前用户引用。


0

还有一件事让我感到奇怪:如果cartID是GUID(唯一标识符),为什么您的删除语句会影响两行?

此外,尝试在cartID的定义中添加长度,也许一些奇怪的默认长度定义导致输入参数被缩短或填充了空格或其他内容。


可能购物车为每个客户端的购物车中的每个项目都有一行。 - Michael Haren
可能是这样,但我会期望一个类似于cart_items的表名..不过我猜你已经找到了答案,哈哈;-) - Thorsten

0

我解决了。

解决方案: ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE]

@cartGUID nvarchar (50)


欢迎来到SO。您应该使用这些后续说明更新您的问题。这不是讨论板,请使用评论或问题获取与问题相关的信息,使用答案获取答案。我很高兴您解决了它。这个特定的问题以前也困扰过我。 - Michael Haren
你应该接受“最佳”答案.. (这将为你和帮助你的人赢得更多的声望)。 - Thorsten
我真的认为你应该考虑选择Marc - 他的答案是正确的做法。 - Michael Haren

0

你的存储过程 SQL 看起来有点奇怪,你复制对了吗?

老实说,这看起来不像是可以编译的:

WHERE
  CartGUID =@cartGUID

in (Select

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接