2009-10-07 5 views
0

Dans une procédure stockée, je suis en train de mettre à jour conditionnellement un champ (comme la 2ème ligne dans l'instruction SQL ci-dessous)Comment mettre à jour de manière conditionnelle un champ texte/ntext dans SQL?

UPDATE [some_stuff] SET 
    last_update = CASE WHEN val = @NewVal THEN last_update ELSE GETDATE() END, 
    val = @NewVal 

... mais pour un texte/champ ntext. Quel est le moyen le plus efficace de faire cela? Est-ce que cela doit être une déclaration distincte UPDATETEXT? Et dois-je faire un SELECT en premier?

Répondre

3

L'exemple ci-dessus fonctionnera dans SQL Server 2005 où val est un champ de texte et vous mettez à jour la valeur entière. Si vous ne remplacez qu'une partie d'un champ, utilisez UPDATETEXT dans une instruction séparée.

Une meilleure solution, si vous pouvez mettre à jour le schéma, est d'utiliser les colonnes VARCHAR (MAX) ou NVARCHAR (MAX). La commande UPDATETEXT a été marquée comme obsolète dans une future version de SQL Server. Si vous utilisez ces types de données, vous pouvez utiliser column_name.WRITE dans l'instruction UPDATE pour remplacer une partie d'une valeur.

+0

Je dois ajouter du texte à la fin du champ de texte. La solution doit fonctionner sur MS SQL 2000-2008. La conversion en VARCHAR (MAX)/NVARCHAR (MAX) est donc désactivée. – Fung

0

Peut-être que l'exemple est pas réaliste, mais ne pouvait pas vous simplifier cela à:

UPDATE [some_stuff] 
SET last_update = GETDATE() 
WHERE val != @NewVal 

La première moitié du boîtier fixe juste le champ lui-même, qui semble un peu inutile.

+0

@John, c'est en fait juste une partie d'une requête plus large. Certains autres champs doivent être mis à jour de manière conditionnelle en fonction de certains autres champs, c'est pourquoi je ne peux pas le mettre comme une clause WHERE à moins que je ne divise les mises à jour. – Fung

Questions connexes