![]() |
Datenbank: SQL-Server • Version: 2000 • Zugriff über: ADO
Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Hallo,
ich habe ein Problem ;) Es gibt zwei Tabellen auf dem SQL-Server. Zwischen diesen Tabellen gibt es einen Datenabgleich. Hier werden die Werte mit einer Insert bzw. Update Anweisung übertragen. Es hat sich herausgestellt, dass Datensätze, in den im Quellfeld mehr Zeichen eingetragenen sind als das Zielfeld erlaubt, nicht übergeben werden. bsp: Quellfeld: Fax 20 Zeichen eingetragen, aber das Zielfeld Fax kann nur 15 Zeichen aufnehmen. Frage: Kann ich (dem SQL-Server oder Delhi) sagen, das in solchen Fällen einfach nur die 15 Zeichen übergeben werden sollen, oder das Feld komplett nicht übergeben werden soll, aber der Rest des Datensatzes schon. Wenn ich das kann, WIE kann ich das machen ??? Ich kann doch nicht bei einer Tabelle mit 200 Feldern und 200.000 Datensätzen jedes einzelne Feld daraufhin prüfen?!?! Oder bleibt mir nichts anderes übrig? Gruss Marco |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Hai DiscMix,
der MS-SQL kennt doch sicher eine Funktion um nur die ersten 15 Zeichen eines Feldes zu verwenden. Wie sieht denn dein Update-String aus? |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Ein Datenabgleich mit unterschiedlicher Tabellenstruktur?
Delphi bietet den Copy-Befehl als String-Operation an. Ich würde aber auch eine Funktion des SQL verwenden. Dann sind die Updates einfacher. Was ist eigentlich mit den letzten Zeichen? Reduziert das nicht den Informationgehalt? Nur mal so angemerkt. |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
ist gar nicht so einfach, da ich denn über stringlisten usw. aufbaue:
bsp:
Delphi-Quellcode:
Alles klar??? ;)
...
ADOCommand1.CommandText := ''; if (Funktion = 1) or (Funktion = 3) then begin //Funktion 1 = Insert ADOCommand1.CommandText := 'insert into Kunde '; ADOCommand1.CommandText := ADOCommand1.CommandText + vInsertInto51E +' VALUES ('+v; end; if Funktion = 2 then begin ADOCommand1.CommandText := 'update Kunde set'; ADOCommand1.CommandText := ADOCommand1.CommandText + vInsertInto51E +' VALUES ('+v; end; for i := 0 to vFelder51Erstmalig.Count-1 do begin //hier wird auf das erste Sonderzeichen geachtet // _ = Konstante ; @ = Zordnungstabelle ; + = Abschneiden beim ersten Leerzeichen if copy(vFelder51Erstmalig.Strings[i],1,1) = '_' then //Hier wird die Konstante zurückgeschrieben. ADOCommand1.CommandText := ADOCommand1.CommandText + copy(vFelder51Erstmalig.Strings[i],2,length(vFelder51Erstmalig.Strings[i])-1)+v+','+v; if copy(vFelder51Erstmalig.Strings[i],1,1) = '+' then ADOCommand1.CommandText := ADOCommand1.CommandText + VorneAB(QueryIntervall.fieldbyname(copy(vFelder51Erstmalig.Strings[i],2,length(vFelder51Erstmalig.Strings[i])-1)).asstring)+v+','+v; if (copy(vFelder51Erstmalig.Strings[i],1,1) <> '_') and (copy(vFelder51Erstmalig.Strings[i],1,1) <> '+') then ADOCommand1.CommandText := ADOCommand1.CommandText + QueryIntervall.fieldbyname(vFelder51Erstmalig.Strings[i]).AsString+v+','+v; end; ADOCommand1.CommandText := ADOCommand1.CommandText + IntToStr(vYear)+v+','+v+vFirma+v+','+v+vZeichen+v+','+v+vKunde+v+')'; try ADOCommand1.Execute; ... Ich glaube damit kommt ihr nicht weiter... |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Hallo DiscMix,
du kannst das z.B. so machen:
SQL-Code:
Hier wird Feld1 auf 15 Stellen gekürzt, und das ganze läuft in einem Schritt durch. Wichtig ist, dass die Felder beides mal die gleiche Reihenfolge haben (im Query, nicht in der Tabelle)
Insert into TabelleNeu (Feld1, Feld2, ..., FeldN) VALUES (SELECT SUBSTRING(Feld1, 1, 15), Feld2, ..., FeldN FROM TabelleAlt)
Greetz alcaeus |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Zitat:
Lieber keine Faxnummer als eine Falsche! Ich würde erst mal die max. Länge feststellen:
SQL-Code:
Dann mit etwas Sicherheitsabstand die nötige Feldgrösse bestimmen.
SELECT MAX(LEN(Fax)) AS MaximaleFaxLaenge
FROM Tabelle Beide Fax-Felder auf die gleiche Grösse bringen. Datentyp: varchar Problem sauber gelöst! :hello: Mit
SQL-Code:
geht's zwar auch, aber siehe oben.
SELECT LEFT(FaxNr , 15) AS Fax15 FROM ...
|
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
ja, substring kenne ich.
Dummerweise kann es sein, das sich die Tabellenstruktur ändert. Eine Überprüfung der einzelenen Felder auf länge und dann den Inhalt ggf. zu kürzen macht das ganze doch ziemlich langsam, oder? |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Wenn sich die Tabellenstruktur ändern kann, solltest du das beim Datenabgleich ebenfalls anpassen und nicht einfach Infos löschen.
Dann sparst du dir die ganzen Folge-Probleme. |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
@jasocul:
Wie meist du das? Das sich die Struktur ändern kann ist klar und auch berücksichtigt. Mir gehts mehr um den Inhalt (der Felder). Muss ich nun jeden Inhalt auf Länge prüfen und mit dem Zielfeld vergleichen? Oder gibt es eine bequemere Lösung? @shmia: Das muss ja nicht unbedingt die Faxnummer sein. Es kann ja auch der Firmenname sein, wenn da ein "GmbH" fehlt ist das "weniger schlimm". |
Re: Datenabgleich: QuellFeld hat mehr Zeichen als Zielfeld?
Etwas ausführlicher was ich meine:
Einen Datenabgleich macht man idR um gleiche Datenbestände zu haben. Am Server A hole ich mir die Daten und bringe diese zum Server B. Nun stelle ich fest, dass Die Felder einer Tabelle auf Server A vergrößert wurden. Demnach kann es passieren, dass ich den Feldinhalt nicht vollständig in die zugehörige Tabelle auf Server B bekomme. Die Folge ist, dass die Daten unvollständig übertragen werden. Jetzt stellt sich die Frage, was man machen sollte. Ich würde also vor dem Einspielen der Daten auf Server B prüfen, ob eine Tabellenänderung vorliegt. Diese Änderung würde ich dann auf Server B ebenfalls durchführen. Danach können die Daten ohne Verlust übertragen werden. Ein Datenabgleich mit Datenverlust finde ich irgendwie sinnlos. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz