2010-07-20 27 views
21

tengo una SP como tal (utilizando SQL Server):Utilizar UPDATE en procedimiento almacenado con parámetros opcionales

ALTER PROCEDURE [dbo].[sp_ClientNotes_update] 
    @id uniqueidentifier, 
    @ordering smallint = NULL, 
    @title nvarchar(20) = NULL, 
    @content text = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE tbl_ClientNotes 
    SET [email protected], [email protected], [email protected] 
    WHERE [email protected] 
END 

me gustaría solamente para establecer los valores si se pasan a la SP, es decir, no NULL. Se puede hacer esto?

This question parece sugerir que la única manera es usar consultas completamente separadas con condicionales, pero para 3 parámetros opcionales esto obviamente sería una pesadilla.

Respuesta

37

Pruebe esto.

ALTER PROCEDURE [dbo].[sp_ClientNotes_update] 
    @id uniqueidentifier, 
    @ordering smallint = NULL, 
    @title nvarchar(20) = NULL, 
    @content text = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE tbl_ClientNotes 
    SET ordering=ISNULL(@ordering,ordering), 
     title=ISNULL(@title,title), 
     content=ISNULL(@content, content) 
    WHERE [email protected] 
END 

También podría valer la pena añadir una parte adicional a la cláusula WHERE, si se utiliza la duplicación transaccional a continuación, se envía otra actualización al suscriptor si todos son NULL, para evitar esto.

WHERE [email protected] AND (@ordering IS NOT NULL OR 
        @title IS NOT NULL OR 
        @content IS NOT NULL) 
+0

Coalesce() es la mejor práctica, no IsNull() – ErikE

+3

No es la mejor práctica, que es la preferencia subjetiva como 'COALESCE' es ANSI. Ambas funciones actúan de manera diferente, para decir que siempre debe usar una sobre la otra ya que las mejores prácticas son incorrectas. Pero en este caso actúan de la misma manera. –

+1

@ chris En realidad, 'ISNULL' es correcto aquí porque cualquiera de esos campos podría ser anulable. Si el parámetro en el procedimiento almacenado es nulo, y el valor actual para el campo también es nulo, obtendrá un error por no proporcionar al menos un valor no nulo a la función 'COALESCE'. Así que sí, tenías razón al usar 'ISNULL', pero no funcionan igual en este caso. –

0
UPDATE tbl_ClientNotes 
SET [email protected], [email protected], [email protected] 
WHERE [email protected] 
AND @ordering IS NOT NULL 
AND @title IS NOT NULL 
AND @content IS NOT NULL 

O si nos referimos sólo desea actualizar columnas individuales que usaría el puesto encima de la mía. Lo leí como si no se actualizan todos los valores son nulos

+1

Esto nunca se actualizará a menos que se proporcionen los 3 parámetros. – Fosco

+0

De hecho, incluso escribí eso. – FlyingStreudel

3
UPDATE tbl_ClientNotes 
    SET 
     [email protected],ordering), 
     title=isnull(@title,title), 
     content=isnull(@content,content) 
    WHERE [email protected] 

Creo recordar haber visto antes que si está actualizando al mismo valor de SQL Server en realidad reconocer esto y no va a hacer una escritura innecesaria.

3

una idea:

UPDATE tbl_ClientNotes 
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title), content=ISNULL(@content, content) 
WHERE [email protected] 
-2
ALTER PROCEDURE LN 
    (
    @Firstname nvarchar(200) 
) 

AS 
BEGIN 

    UPDATE tbl_Students1 
    SET [email protected] 

    WHERE Studentid=3 
END 


exec LN 'Thanvi' 
Cuestiones relacionadas