2009-01-31 6 views
5

Ich habe gespeicherte Prozedur:Gespeicherte Prozedur Abfrage löschen

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE] 

@cartGUID nvarchar 

AS 

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

Als ich dies ausführen,

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

Ergebnis: 0 Zeile (n) betroffen.

Aber, wenn ich versuche, diese Abfrage:

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

Ergebnis: 2 Zeilen betroffen.

Was ist daran falsch?

+0

Sie scheinen keine Größe für @cartGUID angegeben zu haben. Ich glaube, dass Sie eine Größe –

Antwort

4

Wenn Sie darauf bestehen, mit NVARCHAR statt UNIQUE, müssen Sie die Größe angeben:

@cartGUID nvarchar(36) 

Ohne sie Ihre guids abgeschnitten werden (to 30 characters).

Sie können dieses Verhalten bestätigen diese modifizierte Version Ihrer Arbeits Abfrage ausgeführt wird:

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 

ich mit @Marc Gravell zustimmen, obwohl, unique der Weg hier zu gehen.

0

Ihr gespeichertes SQL scheint ein bisschen seltsam, haben Sie es richtig kopiert?

Dieses sieht nicht wie es kompiliert ehrlich zu sein:

WHERE 
    CartGUID [email protected] 

in (Select 
0

Was ist mit, dass IN-Anweisung am Ende Ihrer gespeicherten proc? Es macht keinen Sinn. Einfach loswerden. Außerdem müssen Sie allen Tabellen in der Abfrage und im Sproc "dbo" voranstellen (wer weiß, vielleicht haben Sie in Ihrem Standardschema eine andere Version derselben Tabelle). Diese zwei Dinge zu tun sollte den Trick tun.

3

Sollte @cartGUID eine uniqueidentifier anstatt eine sein? Es ist effizienter, einen einzelnen varchar in eine GUID zu konvertieren und die GUIDs zu vergleichen, als alle GUIDs in varchar zu konvertieren, und hoffen, dass es das gleiche Format verwendet (andernfalls würde die Gleichheit trotzdem fehlschlagen).

Wie andere darauf hingewiesen haben, sieht die WHERE Klausel funky aus, aber mein Geld ist auf der Varchar-Konvertierung der Schuldige.

+0

nicht auch arbeiten müssen. – Jack

+0

Ich stimme zu, versuchen Sie die @ cartGUID zu uniqueidentifier, und auch die Spalte CartGUID sollte vom Typ uniqueidentifier sein. –

0

ich Ihnen die gleiche Tabelle ... unter mehreren Schemas nicht annehmen, haben

dbo.k_ShoppingCart 

vs. 

user1.k_ShoppingCart 

Die gespeicherte Prozedur wird mit „dbo“, während der Ad-hoc-Abfrage den aktuellen Benutzer Referenz verwendet.

0

Noch eine Sache, die mir seltsam erscheint: Wenn cartID eine GUID (und eine eindeutige Kennung) ist, warum wirkt sich Ihre Löschanweisung auf zwei Zeilen aus?

Versuchen Sie auch, eine Länge zur Definition von cartID hinzuzufügen, vielleicht führt eine funkige Standardlänge dazu, dass der Eingabeparameter gekürzt oder mit Leerzeichen oder etwas gefüllt wird.

+0

Vielleicht hat shoppingcart eine Zeile für jeden Artikel im Warenkorb eines Kunden. –

+0

Könnte sein, aber dann würde ich einen Tabellennamen wie cart_items oder so erwarten .. denke du hast die Antwort doch genagelt ;-) – Thorsten

0

Ich löste es.

. Lösung: ALTER PROCEDURE [dbo] [k_ShoppingCart_DELETE]

@cartGUID nvarchar (50)

+0

Willkommen bei SO. Sie sollten Ihre Frage mit diesen Followup-Notizen aktualisieren. Dies ist kein Diskussionsforum - verwenden Sie die Kommentare oder Fragen zu Fragen und Antworten auf Antworten. Ich bin froh, dass du es herausgefunden hast. Dieses spezielle Problem hat mich vorher gebissen. –

+0

Sie sollten auch die "beste" Antwort akzeptieren .. (geben Sie und die Person, die Ihnen etwas mehr Ruf geholfen hat). – Thorsten

+0

Ich glaube wirklich, dass Sie in Betracht ziehen sollten, mit Marc zu gehen - seine Antwort ist der richtige Weg, dies zu tun. –