2009-01-31 131 views
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行(S)。

但是,當我嘗試此查詢:

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

結果:影響2行。

這有什麼問題?

+0

你似乎沒有指定一個大小@cartGUID。我相信你需要指定尺寸 – 2009-01-31 19:08:59

回答

4

如果你堅持使用NVARCHAR而非唯一標識符,你需要指定大小:

@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同意,不過,唯一標識符是去這裏的路。

0

你存儲的proc SQL似乎有點奇怪,你是否正確地複製它?

這看起來並不像它會編譯要誠實:

WHERE 
    CartGUID [email protected] 

in (Select 
0

什麼與在聲明你的存儲過程結束的?這沒有任何意義。只是擺脫它。另外,在查詢和存儲過程中(所有人都知道,在默認模式中可能有相同表的另一個版本),將所有表的前綴加上「dbo」。做這兩件事應該可以做到。

3

應該@cartGUIDuniqueidentifier而不是nvarchar?將單個varchar強制轉換爲guid並比較guid比將所有guid強制轉換爲varchar更有效,並且希望它使用相同的格式(否則相等將會失敗)。

正如其他人指出的,WHERE條款看起來很時髦,但我的錢是在varchar轉換是罪魁禍首。

+0

不能工作。 – Jack 2009-01-31 18:54:08

+0

我同意,請嘗試將@cartGUID更改爲uniqueidentifier,並且CartGUID列也應爲uniqueidentifier類型。 – 2009-01-31 19:23:32

0

我想你不會有下多個模式在同一個表...

dbo.k_ShoppingCart 

vs. 

user1.k_ShoppingCart 

的存儲過程,而即席查詢使用當前用戶參考使用「DBO」。

0

還有一件事讓我覺得很奇怪:如果cartid是一個GUID(和一個唯一標識符),那麼爲什麼你的delete語句會影響兩行?

此外,嘗試添加一個長度的cartID的定義,也許一些時髦的默認長度定義導致輸入參數縮短或填充空白或什麼的。

+0

也許shoppingcart對於客戶購物車中的每件商品都有一排。 – 2009-01-31 19:26:44

0

我解決了它。

解決方案: ALTER PROCEDURE [DBO] [k_ShoppingCart_DELETE]

@cartGUID爲nvarchar (50)