2013-09-28 2 views
0

J'ai une table qui contient deux colonnes qui pourraient être nulles.champ de mise à jour qui pourrait être null dans la procédure stockée

Je souhaite créer une procédure stockée pour modifier cette table. dans la procédure stockée Je l'ai fait:

@ID INT, 
    @newBuildingName NVARCHAR(250), 
    @newLocation NVARCHAR(3000), 
    @newImage VARBINARY(MAX) = NULL, 
    @newNote NVARCHAR(3000) = NULL, 
    @result BIT OUTPUT 

Non, je ne peux pas décider à ce stade, si l'utilisateur a entré des valeurs newImage ou newNote champs, donc je ne peux pas dire

UPDATE myTable SET image = @newImage, note = @newNote 

parce que ces deux champs pourraient déjà avoir des valeurs et de cette façon je supprimerais ces vaules,

que devrais-je faire?

Ce que je chose est faire une déclaration if-else et essayer si le premier champ est nul donc faire ma mise à jour sans elle et si mon deuxième champ est nul alors faire ma déclaration de mise à jour sans et si aucun d'entre eux est null alors faites une mise à jour complète mais je pense que c'est un processus très teduis.

Existe-t-il une autre solution plesae?

Merci à l'avance

Répondre

1

Vous pouvez utiliser la fonction coalesce:

UPDATE myTable 
SET 
    image = COALESCE(@newImage,image), 
    note = COALESCE(@newNote,note) 

Si l'image est non nul, alors il ne sera pas changé. Même chose pour la colonne note

+1

mais dans ce cas si ce n'est déjà null, il n'y aura pas de mise à jour, quelle est la solution pease? –

+0

L'échange des valeurs, c'est-à-dire 'image = Coalesce (@newImage, image)' mettra à jour le champ si la nouvelle valeur n'est pas NULL. La méthode explicite serait d'ajouter un bit pour chaque champ vague et d'utiliser quelque chose comme 'image = case quand @SetImage = 1 puis @newImage else image end'. – HABO

+0

Coalesce paramètres échangés comme HABO suggéré –

1

Faire les instructions Sinon si de telle sorte que vous pouvez décider des entités que vous souhaitez mettre à jour sans commettre en fait la mise à jour.

Vous devez déjà avoir la valeur de l'entité entière dans votre code, disons dans votre modèle. Veuillez vérifier le scénario suivant.

if(!String.IsNullOrEmpty(@newImage)) 
{ 
    //include the values @newImage to the entity to update 
} 
if(!String.IsNullOrEmpty(@newNote)) 
{ 
    //include the values @newNoteto the entity to update 
} 
EntityToUpdate.saveChangestoDB(); 
+0

S'il vous plaît êtes-vous sûr? c'est une partie très essentielle dans ma base de données –

+0

qu'est-ce que entityToUpdate? –

+0

Il est recommandé de conserver une entité de données ensemble chaque fois que vous extrayez des données de la base de données ou lorsque vous réécrivez en DB. C'est juste conceptuel, dans votre cas –

0

Essayez ceci:

UPDATE myTable 
SET image = CASE WHEN image IS NULL THEN @newImage ELSE image END 
,note = CASE WHEN note IS NULL THEN @newNote ELSE note END 

Bien sûr, vous pouvez utiliser la fonction ISNULL aussi ... par exemple

note = CASE WHEN ISNULL(note,'') = '' THEN @newNote ELSE note END

pour faire face à la fois la note IS NULL et la note égale à '' (chaîne vide)

Questions connexes