2009-01-31 8 views
5

Je procédure stockée:procédure stockée supprimer requête

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE] 

@cartGUID nvarchar 

AS 

DELETE FROM 
    [dbo].[k_ShoppingCart] 
WHERE 
    CartGUID = @cartGUID 

Quand j'exécute ce,

exec dbo.k_ShoppingCart_DELETE '32390b5b-a35a-4e32-8393-67d5629192f0' 

Résultat: 0 ligne (s) affecté.

Mais, lorsque je tente cette requête:

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

Résultat: 2 lignes affectées.

Quel est le problème avec cela?

+0

vous ne semblez pas avoir spécifié une taille pour @cartGUID. Je crois que vous devez spécifier une taille –

Répondre

4

Si vous insistez sur l'utilisation NVARCHAR au lieu de UNIQUEIDENTIFIER, vous devez spécifier la taille:

@cartGUID nvarchar(36) 

Sans elle, vos GUIDs sont tronqués (to 30 characters).

Vous pouvez confirmer ce comportement en exécutant cette version modifiée de votre requête de travail:

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 

Je suis d'accord avec @Marc Gravell, cependant, uniqueidentifier est le chemin à parcourir ici.

0

Votre proc SQL stocké semble un peu étrange, avez-vous le copier correctement?

Cela ne ressemble pas à ce compilera pour être honnête:

WHERE 
    CartGUID [email protected] 

in (Select 
0

Quoi Dans cette déclaration à la fin de votre proc stocké? Cela n'a aucun sens. Débarrassez-vous-en. Aussi, préfixez toutes vos tables avec "dbo" dans la requête et dans le sproc (qui sait, vous pourriez avoir une autre version de la même table dans votre schéma par défaut). Faire ces deux choses devrait faire l'affaire.

3

Est-ce que @cartGUID devrait être un uniqueidentifier plutôt qu'un nvarchar? Il est plus efficace de lancer un seul varchar vers un guid et de comparer les guids que de convertir tous les guids en varchar, et espérer qu'il utilise le même format (sinon l'égalité échouera de toute façon).

Comme d'autres l'ont souligné, la clause WHERE semble géniale, mais mon argent est sur la conversion de varchar étant le coupable.

+0

ne fonctionne pas aussi. – Jack

+0

Je suis d'accord, essayez de changer le @cartGUID à uniqueidentifier, et aussi la colonne CartGUID devrait être de type uniqueidentifier. –

0

Je ne pense pas que vous avez la même table sous plusieurs schémas ...

dbo.k_ShoppingCart 

vs. 

user1.k_ShoppingCart 

La procédure stockée utilise « dbo » pendant que la requête ad hoc utilise la référence de l'utilisateur actuel.

0

Encore une chose qui me semble étrange: Si cartID est un GUID (et un identifiant unique), pourquoi votre instruction delete affecte-t-elle deux lignes? Essayez aussi d'ajouter une longueur à la définition de cartID, peut-être qu'une définition de longueur par défaut funky conduit à raccourcir le paramètre d'entrée ou à remplir des espaces ou quelque chose de ce genre.

+0

Peut-être que shoppingcart a une ligne pour chaque article dans le panier d'un client. –

+0

Pourrait être, mais alors je m'attendrais à un nom de table comme cart_items ou alors .. suppose que vous avez cloué la réponse, cependant ;-) – Thorsten

0

Je l'ai résolu.

Solution:. PROCÉDURE ALTER [dbo] [k_ShoppingCart_DELETE]

nvarchar @cartGUID (50)

+0

Bienvenue à SO. Vous devriez mettre à jour votre question avec ces notes de suivi. Ce n'est pas un forum de discussion - utilisez les commentaires ou la question pour des informations liées aux questions, et des réponses pour les réponses. Je suis content que tu l'aies compris. Ce problème particulier m'a déjà mordu. –

+0

Vous devriez également accepter la "meilleure" réponse .. (vous donnant ainsi que la personne qui vous a aidé à avoir plus de réputation). – Thorsten

+0

Je pense vraiment que vous devriez envisager d'aller avec Marc - sa réponse est la bonne façon de le faire. –