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 行受影响。

这有什么问题?

4

7 回答 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,uniqueidentifier 是去这里的方式。

于 2009-01-31T19:22:03.997 回答
3

应该@cartGUID是一个uniqueidentifier而不是一个nvarchar?将单个 varchar 转换为 guid 并比较 guid 比将所有 guid 转换为 varchar 更有效,并希望它使用相同的格式(否则无论如何相等都会失败)。

正如其他人指出的那样,该WHERE子句看起来很时髦,但我的钱是 varchar 转换是罪魁祸首。

于 2009-01-31T18:43:26.960 回答
0

您的存储过程 SQL 似乎有点奇怪,您是否正确复制它?

老实说,这看起来不会编译:

WHERE
  CartGUID =@cartGUID

in (Select
于 2009-01-31T18:41:22.720 回答
0

存储过程末尾的 IN 语句是什么?这没有任何意义。摆脱它。此外,在查询和存储过程中为所有表加上“dbo”前缀(谁知道,您的默认模式中可能有同一个表的另一个版本)。做这两件事应该可以解决问题。

于 2009-01-31T18:42:49.113 回答
0

我不认为你在多个模式下有同一张表......

dbo.k_ShoppingCart

vs.

user1.k_ShoppingCart

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

于 2009-01-31T19:04:06.573 回答
0

还有一件事对我来说很奇怪:如果 cartID 是 GUID(和唯一标识符),为什么您的 delete 语句会影响两行?

另外,尝试在 cartID 的定义中添加一个长度,也许一些时髦的默认长度定义会导致输入参数被缩短或填充空白或其他东西。

于 2009-01-31T19:18:01.913 回答
0

我解决了。

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

@cartGUID nvarchar (50)

于 2009-01-31T19:49:52.940 回答