Jag vill föra över addressinformation från en tabell till en annan. Problemet är att ett fält i destinationstabellen inte existerar i ursprungstabellen (kontaktperson). Är du blyg? Eller varför vågar du inte visa ditt visitkort? Är på G att testa... Ditt upplägg verkar vettigt så det kommer troligtvis att fungera. (Nu kan du läsa mitt vistikort också. Inte för att det står så mycket där, men ändå...) Jag verkar göra något fel vid inserten... KAn det vara att CustomerNumber har annan datatyp än [NAME]. Hejsan Tack Micke (och Andreas för grunden till SQL satsen) Jag får inte följande att fungera. HejsanVillkorlig uppdatering/insert av data
Det jag vill göra, i samma operation, är:
1. Föra över eventuella nya poster.
2. Uppdatera eventuella ändringar.
3. Behålla alla värden i fältet Kontaktperson.
Finns det något smidigt sätt att göra detta?Sv: Villkorlig uppdatering/insert av data
Först tycker jag du uppdaterar:
UPDATE Destination SET Destination.Fält1 = Source.Fält1, Destination.Fält2 = Source.Fält2, Destination.Fält3 = Source.Fält3
Destination INNER JOIN Source ON Destination.ID = Source.ID
Sedan infogar du poster som saknas:
INSERT INTO Destination (Fält1, Fält2, Fält3)
SELECT Source.Fält1, Source.Fält2, Source.Fält3
FROM Source
WHERE NOT Source.ID IN (SELECT Destination.ID FROM Destination)
Eller om det är fler fält som skall matchas:
INSERT INTO Destination (Fält1, Fält2, Fält3)
SELECT Source.Fält1, Source.Fält2, Source.Fält3
FROM Source LEFT JOIN Destination ON Destination.FirstName = Source.FirstName AND Destination.LastName = Source.LastName
WHERE Destination.ID Is NullSv: Villkorlig uppdatering/insert av data
Sv: Villkorlig uppdatering/insert av data
Källdata: _TESTcae
Källtabell: CustomerTEST
Målkdata: LIMS_DEV
Måltabell2: CUSTOMER
<code>
use LIMS_DEV
INSERT INTO LIMS_DEV.dbo.CUSTOMER([NAME], COMPANY_NAME, ADDRESS1, ADDRESS2, ADDRESS3, ADDRESS4, PHONE_NUM, FAX_NUM)
SELECT _TESTcae.dbo.CustomerTEST.CustomerNumber, _TESTcae.dbo.CustomerTEST.FullName, _TESTcae.dbo.CustomerTEST.Address, _TESTcae.dbo.CustomerTEST.ZipCode, _TESTcae.dbo.CustomerTEST.City, _TESTcae.dbo.CustomerTEST.Country, _TESTcae.dbo.CustomerTEST.Fax, _TESTcae.dbo.CustomerTEST.Phone
FROM _TESTcae.dbo.CustomerTEST
WHERE NOT _TESTcae.dbo.CustomerTEST.CustomerNumber IN (SELECT [NAME] FROM LIMS_DEV.dbo.CUSTOMER)
</code>
Följande meddelande erhålls:
Server: Msg 446, Level 16, State 9, Line 1
Cannot resolve collation conflict for equal to operation.
Vad gör jag för fel???
ÄNDRING: Jag har konstaterat att det är WHERE-satsen som felar. Utan denna går det att "INSERTA"Sv: Villkorlig uppdatering/insert av data
Sv: Villkorlig uppdatering/insert av data
Det är antagligen olika collation pä fälten du jämför i WHERE-satsen.. Antingen ändrar du collation på fälten så att båda har lika eller så kan du fixa det i WHERE-satsen..
WHERE NOT Username COLLATE SQL_Latin1_General_CP1_CI_AI IN (SELECT Username COLLATE SQL_Latin1_General_CP1_CI_AI FROM Users)
Det finns olika collation du kan använda.. Detta är bara ett exempel..
MickeSv: Villkorlig uppdatering/insert av data
Collation var problemet. Jag använde den collation du använde i ditt exempel. Funkade direkt.
Jag visste att collations kunde påverka olika saker, men det enda som står i fälten jag jämför är siffror i varchar-form. Men det räckte tydligen för att ställa till det.
Jag avslutar inte denna tråd riktigt än. Ska prova UPDATE också.Sv: Villkorlig uppdatering/insert av data
<code>
use LIMS_DEV
UPDATE CUSTOMER SET
CUSTOMER.COMPANY_NAME=_TESTcae.dbo.CustomerTEST.FullName,
CUSTOMER.ADDRESS1=_TESTcae.dbo.CustomerTEST.Address,
CUSTOMER.ADDRESS2=_TESTcae.dbo.CustomerTEST.ZipCode,
CUSTOMER.ADDRESS3=_TESTcae.dbo.CustomerTEST.City,
CUSTOMER.ADDRESS4=_TESTcae.dbo.CustomerTEST.Country,
CUSTOMER.PHONE_NUM=_TESTcae.dbo.CustomerTEST.Phone,
CUSTOMER.FAX_NUM=_TESTcae.dbo.CustomerTEST.Fax
[DENNA RAD FELAR] LIMS_DEV.dbo.CUSTOMER
INNER JOIN _TESTcae.dbo.CustomerTEST ON LIMS_DEV.dbo.CUSTOMER.[NAME] = _TESTcae.dbo.CustomerTEST.CustomerNumber
</code>
Felmeddelande:
Server: Msg 170, Level 15, State 1, Line 10
Line 10: Incorrect syntax near 'LIMS_DEV'.
Det borde stå någonting innan LIMS_DEV.dbo.CUSTOMER på den felaktiga raden. Eller?Sv: Villkorlig uppdatering/insert av data
Om du vill uppdatera en tabell med data baserad på en annan så bör följande syntax fungera..
UPDATE Table1 SET Table1.Field1 = Table2.Field1,...
FROM Table2
WHERE Table1.ID = Table2.ID
Jag tror också att du får samma problem med collation i denna WHERE-sats, men nu kan du det :)
MIcke