5 Stimmen

Stored Procedure Abfrage löschen

Ich habe eine gespeicherte Prozedur:

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE]

@cartGUID nvarchar

AS

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

Wenn ich dies ausführe,

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

Ergebnis: 0 Zeile(n) betroffen.

Aber, wenn ich diese Abfrage versuche:

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

Ergebnis: 2 Zeilen betroffen.

Was ist daran falsch?

4voto

Michael Haren Punkte 101002

Wenn Sie darauf bestehen, NVARCHAR anstelle von UNIQUEIDENTIFIER zu verwenden, müssen Sie die Größe angeben:

@cartGUID nvarchar(36)

Ohne diese Option werden Ihre Guids abgeschnitten ( bis 30 Zeichen ).

Sie können dieses Verhalten bestätigen, indem Sie diese geänderte Version Ihrer Arbeitsabfrage ausführen:

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 stimme jedoch @Marc Gravell zu, dass eine eindeutige Identifizierung hier der richtige Weg ist.

3voto

Marc Gravell Punkte 970173

Sollte @cartGUID ein sein uniqueidentifier und nicht eine nvarchar ? Es ist effizienter, ein einzelnes varchar in eine guid umzuwandeln und die guids zu vergleichen, als alle guids in varchar umzuwandeln und zu hoffen, dass sie das gleiche Format verwenden (sonst schlägt die Gleichheit sowieso fehl).

Wie andere bereits festgestellt haben, ist die WHERE Klausel sieht komisch aus, aber ich tippe darauf, dass die varchar-Konvertierung der Übeltäter ist.

0voto

Noel Kennedy Punkte 11838

Ihr Stored-Proc-SQL scheint etwas seltsam zu sein, haben Sie es richtig kopiert?

Um ehrlich zu sein, sieht es nicht so aus, als würde es kompiliert werden:

WHERE
  CartGUID =@cartGUID

in (Select

0voto

Dave Markle Punkte 91733

Was hat es mit dieser IN-Anweisung am Ende Ihres Stored Proc auf sich? Das macht keinen Sinn. Schaffen Sie sie einfach ab. Stellen Sie außerdem allen Ihren Tabellen in der Abfrage und im Sproc das Präfix "dbo" voran (wer weiß, vielleicht haben Sie ja eine andere Version derselben Tabelle in Ihrem Standardschema). Wenn Sie diese beiden Dinge tun, sollte der Trick funktionieren.

0voto

beach Punkte 7912

Ich nehme nicht an, dass Sie dieselbe Tabelle in mehreren Schemata haben...

dbo.k_ShoppingCart

vs.

user1.k_ShoppingCart

Die gespeicherte Prozedur verwendet "dbo", während die Ad-hoc-Abfrage den aktuellen Benutzerbezug verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X