J'ai 2 tables avec les mêmes colonnes. La première table Temp1 est chargée avec un sp et est temporaire. Il permet de charger une table T1 sur un environnement de production. Par exemple, j'ai ces données:

Table Temp1 


Id  Col1    Col2    Col3    Col4    Col5
2   null    null    0.5     null    0.6
3   0.1     null    null    null    null


Table T1 

Id  Col1    Col2    Col3    Col4    Col5
1   2        3       0.4       5    0.6
2   5        4         6       4    7
3   8        9         7       10   1

Je dois mettre à jour T1 avec les données de Temp1 uniquement lorsque les colonnes de Temp1 ne sont pas nulles et n'ont pas la même valeur dans T1 (valeurs en gras dans mon exemple).

Je suis coincé avec ce problème. Des idées s'il vous plaît?

Merci,

2
user3463579 19 avril 2017 à 23:04

3 réponses

Meilleure réponse

Utiliser une instruction de mise à jour avec une expression de cas serait quelque chose comme ça.

update tt1
    set Col1 = case when T.Col1 is not null and T.Col1 <> tt1.Col1 then T.Col1 else tt1.Col1 end
from T1 tt1
join Temp1 t on t.Id = tt1.Id
2
Sean Lange 19 avril 2017 à 20:24
UPDATE T1
  SET T1.Col1 = ISNULL(NULLIF(ISNULL(tmp.Col1 , T1.Col1) , T1.Col1) , T1.Col1)
   ,  T1.Col2 = ISNULL(NULLIF(ISNULL(tmp.Col2 , T1.Col2) , T1.Col2) , T1.Col2)
   ,  T1.Col3 = ISNULL(NULLIF(ISNULL(tmp.Col3 , T1.Col3) , T1.Col3) , T1.Col3)
   ,  T1.Col4 = ISNULL(NULLIF(ISNULL(tmp.Col4 , T1.Col4) , T1.Col4) , T1.Col4)
   ,  T1.Col5 = ISNULL(NULLIF(ISNULL(tmp.Col5 , T1.Col5) , T1.Col5) , T1.Col5)
FROM Temp1 tmp
INNER JOIN T1   ON t1.ID = tmp.ID
1
M.Ali 19 avril 2017 à 20:30

Vous pouvez utiliser une instruction merge pour ce problème.

CREATE TABLE #t
    (
        ID int IDENTITY(1,1),
        Name NVARCHAR(50),
        Salary DECIMAL(10,2)
    )

INSERT INTO #t (Name, Salary) VALUES('abc', 123.4)
INSERT INTO #t (Name, Salary) VALUES('pqa', 127.4)
INSERT INTO #t (Name, Salary) VALUES('xyz', 233.4)


CREATE TABLE #tempForT
(
    ID int IDENTITY(1,1),
    Name NVARCHAR(50),
    Salary DECIMAL(10,2)
)

INSERT INTO #tempForT (Name, Salary) VALUES('abc', 200.4)
INSERT INTO #tempForT (Name, Salary) VALUES('pqa', 200.4)
INSERT INTO #tempForT (Name, Salary) VALUES('xyz', NULL)

SELECT * FROM #t
SELECT * FROM #tempForT

enter image description here

Voici la solution

MERGE #t AS DestTable
USING (
        SELECT 
            NAME,
            Salary
        FROM #tempForT
    )SourceTable
    ON DestTable.Name = SourceTable.Name        --Should contain columns like composite primary key
    --AND other columns
WHEN MATCHED
    THEN
        UPDATE 
            SET DestTable.Salary = ISNULL(SourceTable.Salary, DestTable.Salary) --checking for NULL
        ; 

SELECT * FROM #t

enter image description here

Remarque : Si #tempForT contient de nouvelles valeurs (lignes), ces lignes ne seront pas insérées pour cela, vous devez mettre à jour l'instruction de fusion avec WHEN NOT MATCHED dans ce cas insérer nouveaux records.

0
observer 24 avril 2017 à 08:37