存储过程删除查询

Jac*_*ack 5 database stored-procedures sql-delete

我有存储过程:

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE]

@cartGUID nvarchar

AS

DELETE FROM
  [dbo].[k_ShoppingCart]
WHERE
  CartGUID = @cartGUID
Run Code Online (Sandbox Code Playgroud)

当我执行这个时,

exec dbo.k_ShoppingCart_DELETE '32390b5b-a35a-4e32-8393-67d5629192f0'
Run Code Online (Sandbox Code Playgroud)

结果:0行受影响.

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

Delete FROM k_ShoppingCart Where CartGUID = '32390b5b-a35a-4e32-8393-67d5629192f0'
Run Code Online (Sandbox Code Playgroud)

结果:2行受影响.

这有什么问题?

Mic*_*ren 4

如果您坚持使用 NVARCHAR 而不是 UNIQUEIDENTIFIER,则需要指定大小:

@cartGUID nvarchar(36)
Run Code Online (Sandbox Code Playgroud)

如果没有它,您的 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
Run Code Online (Sandbox Code Playgroud)

不过,我同意@Marc Gravell 的观点,uniqueidentifier 是解决问题的方法。