我有存储过程:
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行受影响。
这有什么问题?
答案 0 :(得分:4)
如果您坚持使用NVARCHAR而不是UNIQUEIDENTIFIER,则需要指定尺寸:
@cartGUID nvarchar(36)
没有它,你的guid被截断(to 30 characters)。
您可以通过运行此工作查询的修改版本来确认此行为:
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是去这里的方式。
答案 1 :(得分:3)
@cartGUID
应该是uniqueidentifier
而不是nvarchar
吗?将单个varchar转换为guid并比较guid比将所有guid强制转换为varchar更高效,并希望它使用相同的格式(否则无论如何相等都会失败)。
正如其他人所指出的,WHERE
条款看起来很时髦,但我的钱是变量转换的罪魁祸首。
答案 2 :(得分:0)
您存储的proc SQL似乎有点奇怪,您是否正确复制了它?
这看起来不像是诚实的编译:
WHERE
CartGUID =@cartGUID
in (Select
答案 3 :(得分:0)
存储过程结束时的IN语句是什么?它没有任何意义。摆脱它。此外,在查询和sproc中使用“dbo”为所有表添加前缀(谁知道,您的默认模式中可能有另一个版本的同一个表)。做这两件事应该可以解决问题。
答案 4 :(得分:0)
我不认为你在多个模式下有相同的表...
dbo.k_ShoppingCart
vs.
user1.k_ShoppingCart
当ad-hoc查询使用当前用户引用时,存储过程正在使用“dbo”。
答案 5 :(得分:0)
另外一件对我来说很奇怪的事情:如果cartID是GUID(和唯一标识符),为什么你的delete语句会影响两行?
另外,尝试在cartID的定义中添加一个长度,也许一些时髦的默认长度定义会导致输入参数被缩短或填充空白或其他东西。
答案 6 :(得分:0)
我解决了。
解决方案: ALTER PROCEDURE [dbo]。[k_ShoppingCart_DELETE]
@cartGUID nvarchar (50)