2010-07-20 14 views
21

ho un SP in questo modo (utilizzando SQL Server):Utilizzo di UPDATE in stored procedure con parametri facoltativi

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 

desidero impostare solo i valori se vengono passati SP, cioè non NULL. Può essere fatto?

This question sembra suggerire l'unico modo è utilizzare query completamente separate con condizionali, ma per 3 parametri opzionali questo sarebbe ovviamente un incubo!

risposta

37

Prova questo.

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 

Potrebbe anche essere la pena di aggiungere una parte in più per la clausola WHERE, se si utilizza la replica transazionale allora invierà un altro aggiornamento al sottoscrittore, se tutti sono NULL, per evitare questo.

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

Coalesce() è meglio pratica, non IsNull() – ErikE

+3

Non è delle migliori pratiche, che è la preferenza soggettiva come 'COALESCE' è ANSI. Entrambe le funzioni agiscono in modo diverso, per dire che dovresti sempre usare l'una sull'altra in quanto le migliori pratiche sono sbagliate. Ma in questo caso agiscono allo stesso modo. –

+1

@chris In realtà, 'ISNULL' è corretto qui perché uno di quei campi potrebbe essere annullabile. Se il parametro nella stored procedure è nullo e anche il valore corrente per il campo è nullo, si otterrà un errore per non fornire almeno un valore non nullo alla funzione 'COALESCE'. Quindi sì, hai usato correttamente 'ISNULL', ma in questo caso non si comportano nello stesso modo. –

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 

Oppure, se si intende desideri solo aggiornare singole colonne si può usare il post di cui sopra la mia. L'ho letto come non aggiornare se tutti i valori sono nulli

+1

Questo non verrà mai aggiornato a meno che non vengano forniti tutti e 3 i parametri. – Fosco

+0

In effetti, l'ho scritto anche io. – FlyingStreudel

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

penso Ricordo di aver visto prima che se si sta aggiornando allo stesso valore di SQL Server effettivamente riconoscere questo e non farà una scrittura inutile.

3

One 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' 
Problemi correlati