Insert von archivierten Datensätzen

Indyyan

Grünschnabel
Hallo
Ich Update alle Datensätze von einer Tabell (Temp1), in eine andere namens Best. Dafuer lade ich Textfiles (hab jede Menge davon) in Temp1 und Update / Insert dann Datensätze in die "Best" Tabelle.
Jedoch ist es bei dieser Tabelle etwas kniffliger. Da der Primäre Schluessel nach 3 Jahren wieder von vorne beginnt. Daher Update ich nur die Datensätze die den selben PS als auch erschaffenes Datum haben.
Nur beim Insert habe ich gewisse Probleme, habe es ueber einen OUTER JOIN probiert bekomme aber diese Fehlermeldung:

Server: Msg 209, Level 16, State 1, Line 46
Ambiguous column name 'Best_Nr'


Kann mir wer weiterhelfen

Danke vielmals

Hier der Code:

Code:
update dbo.Best
set dbo.Best.Stålkod = dbo.Temp1.Stålkod,
dbo.Best.Slabs_Bredd = dbo.Temp1.Slabs_Bredd
from Best join dbo.temp1 on Best.Best_Nr = temp1.Best_Nr
where dbo.Best.Best_Nr = dbo.Temp1.Best_Nr  and dbo.temp1.SkapadDat = dbo.Best.SkapadDat
insert into dbo.Best
(.......)
select
........ from dbo.Temp1
LEFT OUTER JOIN dbo.Best
ON dbo.temp1.Best_Nr = dbo.Best.Best_Nr
AND dbo.temp1.SkapadDat = dbo.Best.SkapadDat
WHERE dbo.Best.Best_Nr IS NULL
 
Puh, ich blicke nicht wirklich durch. Das Einzige was mir auffällt....muss hier nich noch n dbo. davor?

PHP:
...on Best.Best_Nr = temp1.Best_Nr

//dann also so:
on dbo.Best.Best_Nr = dbo.temp1.Best_Nr

Kann aber gut sein, dass das totaler Schwachsinn ist, was ich grad gesagt hab. Ich kann mich leider nicht richtig in Dein sql-statement reinfinden.

Fakt ist jedenfalls (laut Fehlermeldung), dass irgendwas in der Benennung von Best_Nr noch nicht stimmt, da es diese Spalte in mehreren Tabellen gibt. Daher muss Best_Nr eine eindeutigen Bezeichnung bekommen, damit klar ist, welche Spalte in welcher Tabelle gemeint ist.
 
Danke Jenno, hab ich ausgebessert... ändert leider aber nichts an der Fehlermeldung!

Ich poste einfach mal den gesamten Code, vielleicht hilft es ja:

Code:
declare @error varchar, @rowcount varchar

select count(*) from dbo.temp1
if (@@error <> 0)
  begin
  Print 'An error occurred reading the temporary import table'
  goto exitpoint
end

begin transaction

update dbo.Best
set 
dbo.Best.Stålkod = dbo.Temp1.Stålkod,
dbo.Best.Slabs_Bredd = dbo.Temp1.Slabs_Bredd,
dbo.Best.Best_Vecka = dbo.Temp1.Best_Vecka,
dbo.Best.Lev_Vecka = dbo.Temp1.Lev_Vecka,
dbo.Best.ABC_Klass = dbo.Temp1.ABC_Klass,
dbo.Best.Stålverk = dbo.Temp1.Stålverk,
dbo.Best.Status = dbo.Temp1.Status,
dbo.Best.old_Charge = dbo.Temp1.old_Charge,
dbo.Best.Anm = dbo.Temp1.Anm,
dbo.Best.Sen_Ä_Dat = dbo.Temp1.Sen_Ä_Dat,
dbo.Best.ExtBestNo = dbo.Temp1.ExtBestNo,
dbo.Best.VV_Vecka = dbo.Temp1.VV_Vecka,
dbo.Best.Charge_Vikt = dbo.Temp1.Charge_Vikt,
dbo.Best.Leverantör = dbo.Temp1.Leverantör,
dbo.Best.Ledig2 = dbo.Temp1.Ledig2,
dbo.Best.Faktureras = dbo.Temp1.Faktureras,
dbo.Best.BestSkriven_ant = dbo.Temp1.BestSkriven_ant
from Best
join dbo.temp1 on dbo.Best.Best_Nr = dbo.temp1.Best_Nr
where dbo.Best.Best_Nr = dbo.Temp1.Best_Nr and dbo.Best.SkapadDat = dbo.Temp1.SkapadDat

select @error = @@error,@rowcount=@@rowcount
if @error <> 0
begin
  print ' Error updating - Error number '+@error+'. Rolling back'
  --this reverses your updates
  rollback
  --this jumps to the end
  goto exitpoint
end

print @rowcount+' rows updated'
insert into dbo.Best
(Best_Nr, Stålkod, Slabs_Bredd, Best_Vecka, Lev_Vecka, ABC_Klass, Stålverk, Status, old_Charge, Anm, SkapadDat, Sen_Ä_Dat, ExtBestNo, VV_Vecka, Charge_Vikt, Leverantör, Ledig2, Faktureras, BestSkriven_ant)
select 
Best_Nr, Stålkod, Slabs_Bredd, Best_Vecka, Lev_Vecka, ABC_Klass, Stålverk, Status, old_Charge, Anm, SkapadDat, Sen_Ä_Dat, ExtBestNo, VV_Vecka, Charge_Vikt, Leverantör, Ledig2, Faktureras, BestSkriven_ant
from dbo.Temp1
LEFT OUTER JOIN dbo.Best
ON dbo.temp1.Best_Nr = dbo.Best.Best_Nr
AND dbo.temp1.SkapadDat = dbo.best.SkapadDat
WHERE dbo.Best.Best_Nr IS NULL
select @error = @@error,@rowcount=@@rowcount
if @error <> 0
  begin
  print ' Error inserting - Error number '+@error
  print ' Rolling back updates and inserts'
  --this reverses your updates and inserts
  rollback
  --this jumps to the end
  goto exitpoint
end

print @rowcount+' rows were inserted'
--this saves your data
commit

exitpoint:


und noch etwas, hab in einem englischsprachigen Forum dasselbe gepostet und diese Antwort bekommen, kann damit aber leider nichts anfangen...

If the column names in both the source and joined table are the same then, at any place where you use them in your query, you must prefix the column name with the table or alias name that you are using.

EG SELECT first.moo from first inner join second on first.moo = second.moo


Vielleicht kann mir ja jemand Helfen ;)
 
If the column names in both the source and joined table are the same then, at any place where you use them in your query, you must prefix the column name with the table or alias name that you are using.
passt bei dir an dieser Stelle:
select
Best_Nr, Stålkod, Slabs_Bredd, Best_Vecka, Lev_Vecka, ABC_Klass, Stålverk, Status, old_Charge, Anm, SkapadDat, Sen_Ä_Dat, ExtBestNo, VV_Vecka, Charge_Vikt, Leverantör, Ledig2, Faktureras, BestSkriven_ant
from dbo.Temp1
LEFT OUTER JOIN dbo.Best
ON dbo.temp1.Best_Nr = dbo.Best.Best_Nr
AND dbo.temp1.SkapadDat = dbo.best.SkapadDat
Du hast hier ein Select mit join von 2 Tabellen, in denen gleichnamige Spalten auftreten. deshalb musst du überall das Präfix davor schreiben, zu welcher Tabelle dieser Spaltenname nun gehören soll. Das kannst du auch mit einem Alias bewerkstelligen, z.B.
PHP:
SELECT tmp.Best_Nr, tmp.Stålkod, tmp.Slabs_Bredd, tmp.Best_Vecka, tmp.Lev_Vecka, tmp.ABC_Klass, tmp.Stålverk, tmp.Status, tmp.old_Charge, tmp.Anm, tmp.SkapadDat, tmp.Sen_Ä_Dat, tmp.ExtBestNo, tmp.VV_Vecka, tmp.Charge_Vikt, tmp.Leverantör, tmp.Ledig2, tmp.Faktureras, tmp.BestSkriven_ant
FROM dbo.Temp1 tmp
LEFT OUTER JOIN dbo.Best bst
ON tmp.Best_Nr = bst.Best_Nr
AND tmp.SkapadDat = bst.SkapadDat

Hilft's? :)
 
Zurück