2009-01-31 6 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 строк (ы) пострадавших.

Но, когда я пытаюсь этот вопрос:

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

Результат: 2 ряда пострадавших.

Что не так с этим?

+0

вы, кажется, не уточнили размер для @cartGUID. Я считаю, что вам нужно указать размер –

ответ

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 путь пойти сюда.

0

Ваш хранимый proc SQL кажется немного странным, вы его скопировали правильно?

Это не выглядит, как он будет компилировать быть честным:

WHERE 
    CartGUID [email protected] 

in (Select 
0

Что с этим в заявлении на конце хранимой прок? Это не имеет никакого смысла. Просто избавься от этого. Кроме того, префикс всех ваших таблиц с «dbo» в запросе и в sproc (кто знает, у вас может быть другая версия той же таблицы в вашей схеме по умолчанию). Выполнение этих двух вещей должно сделать трюк.

3

Должно ли @cartGUID быть uniqueidentifier, а не nvarchar? Эффективнее использовать один varchar для guid и сравнивать гиды, чем отбрасывать все команды на varchar, и надеяться, что он использует тот же формат (иначе равенство в любом случае потерпит неудачу).

Как указывали другие, статья WHERE выглядит фанки, но мои деньги находятся на преобразовании варчара, являющемся виновником.

+0

, который тоже не работает. – Jack

+0

Согласен, попробуйте изменить @cartGUID на uniqueidentifier, а также столбец CartGUID должен иметь тип uniqueidentifier. –

0

Я не думаю, что у вас есть один и тот же стол под несколькими схемами ...

dbo.k_ShoppingCart 

vs. 

user1.k_ShoppingCart 

Хранимая процедура использует «DBO», а одноранговый запрос с использованием текущей ссылки пользователя.

0

Еще одна вещь, которая выглядит странно для меня: Если идентификатор ID является идентификатором GUID (и уникальным идентификатором), почему ваш оператор удаления влияет на две строки?

Кроме того, попробуйте добавить длину к определению идентификатора cartID, возможно, какое-то фанковое определение длины по умолчанию приводит к сокращению или заполнению входного параметра пробелами или чем-то еще.

+0

Возможно, в корзине покупок есть строка для каждого элемента в корзине клиента. –

+0

Может быть, но тогда я бы ожидал имя таблицы, например, cart_items или так. Угадайте, что вы прибили ответ, хотя ;-) – Thorsten

0

Я решил.

Решение. ALTER PROCEDURE [DBO] [k_ShoppingCart_DELETE]

@cartGUID NVARCHAR (50)

+0

Добро пожаловать в SO. Вы должны обновить свой вопрос с помощью последующих заметок. Это не доска объявлений - используйте комментарии или вопрос для информации, связанной с вопросом, и ответы на ответы. Я рад, что вы это поняли. Этот вопрос уже укусил меня. –

+0

Вы также должны принять «лучший» ответ .. (давая вам и человеку, который помог вам еще больше репутации). – Thorsten

+0

Я действительно думаю, что вам стоит подумать о том, чтобы пойти с Марком - его ответ - правильный способ сделать это. –