Хранимая процедура удаления запроса - PullRequest
5 голосов
/ 31 января 2009

У меня есть хранимая процедура:

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 строки.

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

Ответы [ 7 ]

4 голосов
/ 31 января 2009

Если вы настаиваете на использовании NVARCHAR вместо UNIQUEIDENTIFIER, вам необходимо указать размер:

@cartGUID nvarchar(36)

Без этого ваши направляющие усекаются ( до 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, хотя этот способ - уникальный способ идентификации.

3 голосов
/ 31 января 2009

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

Как уже отмечали другие, предложение WHERE выглядит странно, но мои деньги на конвертацию варшаров, являющуюся виновником.

0 голосов
/ 31 января 2009

Я решил это.

Решение: ALTER PROCEDURE [dbo]. [K_ShoppingCart_DELETE]

@ cartGUID nvarchar (50)

0 голосов
/ 31 января 2009

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

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

0 голосов
/ 31 января 2009

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

dbo.k_ShoppingCart

vs.

user1.k_ShoppingCart

Хранимая процедура использует "dbo", в то время как специальный запрос использует текущую пользовательскую ссылку.

0 голосов
/ 31 января 2009

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

0 голосов
/ 31 января 2009

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

Не похоже, что это скомпилируется, если честно:

WHERE
  CartGUID =@cartGUID

in (Select
...