2009-01-31 24 views
5

he almacenado:Procedimiento almacenado consulta de eliminación

ALTER PROCEDURE [dbo].[k_ShoppingCart_DELETE] 

@cartGUID nvarchar 

AS 

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

Cuando ejecuto esto,

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

Resultado: 0 fila (s) afectada.

embargo, cuando intento esta consulta:

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

Resultado: 2 filas afectadas.

¿Qué pasa con esto?

+0

no parecen haber especificado un tamaño de @cartGUID. Creo que debes especificar que el tamaño –

Respuesta

4

Si usted insiste en el uso de NVARCHAR en lugar de UNIQUEIDENTIFIER, es necesario especificar el tamaño:

@cartGUID nvarchar(36) 

Sin ella, se están truncados sus guids (to 30 characters).

Puede confirmar este comportamiento mediante la ejecución de esta versión modificada de la consulta de trabajo:

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 

Estoy de acuerdo con @Marc Gravell, sin embargo, uniqueidentifier es el camino a seguir aquí.

0

Su SQL de proceso almacenado parece un poco extraño, ¿lo copió correctamente?

Esto no se ve como se compilará para ser honesto:

WHERE 
    CartGUID [email protected] 

in (Select 
0

Qué hay con que en la declaración en el final de su procedimiento almacenado? No tiene ningún sentido. Solo deshazte de eso. Además, prefija todas sus tablas con "dbo" en la consulta y en el comando sproc (quién sabe, puede tener otra versión de la misma tabla en su esquema predeterminado). Hacer esas dos cosas debería hacer el truco.

3

¿Debería @cartGUID ser uniqueidentifier en lugar de nvarchar? Es más eficiente lanzar un solo varchar a un guid y comparar las guids de lo que es lanzar todas las guids a varchar, y esperamos que use el mismo formato (de lo contrario, la igualdad fallará de todos modos).

Como han señalado otros, la cláusula WHERE tiene un aspecto funky, pero mi dinero está en la conversión varchar siendo el culpable.

+0

no funciona. – Jack

+0

Acepto, intente cambiar @cartGUID a uniqueidentifier, y también la columna CartGUID debe ser del tipo uniqueidentifier. –

0

No suponga que tiene la misma mesa bajo varios esquemas ...

dbo.k_ShoppingCart 

vs. 

user1.k_ShoppingCart 

El procedimiento almacenado está utilizando "dbo", mientras que la consulta ad hoc está utilizando la referencia de usuario actual.

0

Una cosa más que me parece extraña: si cartID es un GUID (y un identificador único) ¿por qué su declaración de eliminación afecta dos filas?

Además, intente agregar una longitud a la definición de cartID, tal vez una definición de longitud por defecto funky conduce al parámetro de entrada que se acorta o se llena con espacios en blanco o algo así.

+0

Quizás shoppingcart tenga una fila para cada artículo en el carrito de un cliente. –

+0

Podría ser, pero entonces esperaría un nombre de tabla como cart_items más o menos ... Supongo que has encontrado la respuesta, aunque ;-) – Thorsten

0

Lo resolví.

Solución:. ALTER PROCEDIMIENTO [dbo] [k_ShoppingCart_DELETE]

nvarchar @cartGUID (50)

+0

Bienvenido a SO. Debe actualizar su pregunta con estas notas de seguimiento. Este no es un foro de discusión: use los comentarios o preguntas para obtener información relacionada con las preguntas y respuestas para las respuestas. Me alegra que lo hayas descifrado. Este problema en particular me ha mordido antes. –

+0

También debe aceptar la "mejor" respuesta ... (que le brinda a usted y a la persona que le ayudó a obtener más reputación). – Thorsten

+0

Realmente creo que deberías considerar ir con Marc, su respuesta es la forma correcta de hacerlo. –

Cuestiones relacionadas