2009-10-22 20 views
5

Chcę zaktualizować tabelę o nazwie Sorels_ext z tabeli o nazwie Sorels. Łącze między nimi to id fkey_id_sorels_ext jest równy kolumnie identity_sorels tabeli Sorels. Jest to moja pierwsza próba porównania Merge i próbuję nauczyć się składni.Potrzebujesz pomocy z instrukcją Merge

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END from Sorels AS SOR) 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, SORe.Color = select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

Gdy uruchomię to pojawia się następujący błąd:

błąd 22.10.2009 13:38:51 0: 00: 00.000 SQL Server Database Error: Niepoprawna składnia w pobliżu słowo kluczowe ' NA'. 46 0

*** dodana informacja ******

Po pierwsze poprawka sugeruje, kod jest w następujący sposób:

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END from Sorels) AS SOR 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

Teraz pojawia się następujący błąd:

Błąd 10/22/2009 2:03:29 PM 0: 00: 00.000 Błąd bazy danych SQL Server: Lista wstawianych kolumn używana w instrukcji MERGE nie może zawierać identyfikatorów wieloczęściowych. Zamiast tego użyj identyfikatorów pojedynczych części. 55 0

******* dodał więcej INFO ****** Po korektach z sugestiami, mam następujący:

MERGE Sorels_ext AS SORe 
USING (select SOR1.identity_column, CASE 
     WHEN left(SOR1.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR1.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END as colors from Sorels as SOR1) as SOR 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (fkey_id, Color) VALUES (SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

pojawia się błąd:

Error 10/22/2009 2:46:51 PM 0: 00: 00.000 Błąd bazy danych SQL Server: Niepoprawna nazwa kolumny "FPARTNO". 56 0

Co robię źle?

**** I GOT IT !!! *****

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END as colors from Sorels as SOR) SOR1 
ON (SORe.fkey_id = SOR1.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR1.identity_column, SORe.Color = SOR1.colors 
WHEN NOT MATCHED THEN 
    INSERT (fkey_id, Color) VALUES (SOR1.identity_column, SOR1.colors); 
+0

Gratulacje. –

+0

Małe dodanie: nie ma sensu przypisywanie 'fkey_id = identity_column', ponieważ zapytanie już potwierdziło, że ma tę samą wartość. –

Odpowiedz

4

wierzę trzeba alias swojej danych źródłowych tak:

USING (select SOR.identity_column, 
    CASE WHEN left(SOR.FPARTNO, 2) = 'BL' 
    THEN 'Blue'   
    WHEN left(SOR.FPARTNO, 2) = 'RD' 
    THEN 'Red'   
    ELSE 'White'  
    END from Sorels AS SOR) **AS SOR** ON (SORe.fkey_id = SOR.identity_column) 
+1

Uzgodnione. W przykładzie OP użyto aliasu tabeli, który nie istnieje w tym JOIN. –

+0

Właśnie zredagowałem to z tą poprawką i nowym błędem. Naprawdę doceniam twoją cierpliwość. – DavidStein

+0

Zaktualizowałem go ponownie. Używam aliasów, aby było łatwiej i wyraźniej, i wydaje się, że mają odwrotny skutek. – DavidStein

0

Spróbuj wyjmując "jak" w ") jako SOR"

5
INSERT (SORe.fkey_id, SORe.Color) 

powinien brzmieć:

INSERT (fkey_id, Color) 

kolumny w wykazie wkładka CA n odnosi się tylko do tabeli docelowej. Analizator składni nie spodziewa się widzieć tam aliasu tabeli i nie wie, jak go rozwiązać.

Jeśli widzi "kolumnę1", wie, że należy do tabeli docelowej. Widzi "table1.column1", nie wie, co oznacza "table1", ponieważ "table1" jako token jest poza zakresem.

+0

Zgadzam się z Piotrem w tej sprawie. – rfonn

+0

To zadziałało, ale czy możesz wyjaśnić, dlaczego? – DavidStein

+1

Kolumny na liście wstawiania odnoszą się tylko do tabeli docelowej, więc analizator składni nie spodziewa się, że zobaczy tam alias tabeli, nie będzie wiedział, jak go rozwiązać. Widzi "column1", wie, że należy do tabeli docelowej. Widzi "table1.column1", nie wie, co oznacza "table1". "tabela1" jest poza zasięgiem, że tak powiem. –

Powiązane problemy