2009-01-31 2 views
5

ho stored procedure:stored procedure query di eliminazione

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE] 

@cartGUID nvarchar 

AS 

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

Quando eseguo questo,

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

Risultato: 0 row (s) affected.

Ma, quando provo questa query:

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

Risultato: 2 righe interessate.

Cosa c'è di sbagliato in questo?

+0

non sembrano avere specificato una dimensione per @cartGUID. Credo che sia necessario specificare una dimensione –

risposta

4

Se ti ostini a usare NVARCHAR invece di UNIQUEIDENTIFIER, è necessario specificare la dimensione:

@cartGUID nvarchar(36) 

Senza di essa, i tuoi GUID vengono troncati (to 30 characters).

È possibile confermare questo comportamento eseguendo questa versione modificata della query di lavoro:

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 

Sono d'accordo con @ Marc Gravell, però, uniqueidentifier è il modo di andare qui.

0

Il tuo SQL proc memorizzato sembra un po 'strano, lo hai copiato correttamente?

Questo non sembra che verrà compilato per essere onesti:

WHERE 
    CartGUID [email protected] 

in (Select 
0

cosa è con che nella dichiarazione alla fine del proc memorizzato? Non ha alcun senso. Liberatene. Inoltre, anteponi tutte le tue tabelle con "dbo" nella query e nello sproc (chissà, potresti avere un'altra versione della stessa tabella nello schema predefinito). Fare quelle due cose dovrebbe fare il trucco.

3

Dovrebbe essere @cartGUID un uniqueidentifier anziché uno nvarchar? È più efficiente lanciare un singolo varchar su un guid e confrontare i guids piuttosto che lanciare tutti i guids su varchar, e sperare che usi lo stesso formato (altrimenti l'uguaglianza fallirà comunque).

Come altri hanno sottolineato, la clausola WHERE sembra funky, ma i miei soldi sono sulla conversione varchar che è il colpevole.

+0

non funzionante. – Jack

+0

Sono d'accordo, prova a cambiare @cartGUID con uniqueidentifier, e anche la colonna CartGUID dovrebbe essere di tipo uniqueidentifier. –

0

Non si supponga di avere lo stesso tavolo sotto più schemi ...

dbo.k_ShoppingCart 

vs. 

user1.k_ShoppingCart 

La stored procedure sta usando "dbo", mentre la query ad-hoc sta usando il riferimento per l'utente corrente.

0

Un'altra cosa che mi sembra strana: se cartID è un GUID (e un identificatore univoco) perché l'istruzione di eliminazione influisce su due righe?

Inoltre, provare ad aggiungere una lunghezza alla definizione di cartID, forse qualche definizione di lunghezza predefinita funky porta al parametro di input accorciato o pieno di spazi vuoti o qualcosa del genere.

+0

Forse shoppingcart ha una riga per ogni articolo nel carrello di un cliente. –

+0

Potrebbe essere, ma poi mi aspetterei un nome di tabella come cart_items o così .. indovina hai inchiodato la risposta, però ;-) – Thorsten

0

Ho risolto.

Soluzione:. ALTER PROCEDURE [dbo] [k_ShoppingCart_DELETE]

@cartGUID nvarchar (50)

+0

Benvenuti in SO. Dovresti aggiornare la tua domanda con queste note di follow-up. Questo non è un forum di discussione: usa i commenti o le domande per le informazioni relative alle domande e le risposte per le risposte. Sono felice che tu l'abbia capito. Questo particolare problema mi ha morso prima. –

+0

Dovresti anche accettare la risposta "migliore" .. (dando a te e alla persona che ti ha aiutato un po 'più di reputazione). – Thorsten

+0

Penso davvero che dovresti prendere in considerazione l'idea di andare con Marc: la sua risposta è il modo giusto per farlo. –