Hilfe: MS SQL Tabelle Updaten
Hallo liebe Community,
ich habe leider keine Kategorie für SQL oder SQl Server fragen gefunden daher hier im Allgemein Thread.
Nun zu meiner Herausforderung:
Ich habe einen SQL EXPRESS Server und das MS SQL Server Managment Studio (SSMS V18.7)
in einer Tabelle mit namen M_MATERIAL stehen Tausende Produkte, mit Beschreibungen und Preise, uvm.
Diese Informationen hab ich mir in eine Excel Datei Kopiert und komplett Überarbeitet.
So wie Ihr euch denken könnt möchte ich jetzt die geänderten Werte zurück in die Haupttabelle schreiben lassen.
Ich habe es zuerst mit Bulk Import probiert, da bekomm ich aber ständig Datenkonvertierungs fehlermeldungen die ich nicht weg bekomme.
Jetzt dachte ich mir , wenn das mit dem Bulk Import nicht Funktioniert, Importierst du einfach die CSV in eine 2. Tabelle und versuchst die HauptTabelle M_Material mit den werten der Importen CSV und neu erstellten Tabelle "M_MAT" zu überrschreiben/Updaten.
Im endeffekt will ich das ALLE Daten von "M_MAT" in "M_MATERIAL" Kopiert werden und am besten die vorhanden überschrieben werden.
Leider finde ich nur Anleitungen wo man nur 1 Preis aktualliseren würde. das hilft mir aber nicht da ich 50 Spalten und Tausende Zeilen habe.
Bisher hab ich das so geschrieben, da bekomm ich aber die Fehlermeldung, ich weiss auch nicht ob ich eine WHERE bedingung mit schreiben MUSS ?
" Msg 8102, Level 16, State 1, Line 1 Die MAT_ID-Identitätsspalte kann nicht aktualisiert werden."
UPDATE dbo.M_MATERIAL
SET dbo.M_MATERIAL.MAT_ID = dbo.M_MAT.MAT_ID
FROM dbo.M_MAT
INNER JOIN dbo.M_MATERIAL
ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID)
also falls jemand eine idee hat wie ich die Daten aus einer TXT oder Excel Datei oder wie grad beschrieben von einer Tabelle in die andere, dann immer gern raus damit
Ärgere mich seit Tagen damit rum.
Ps bevor die Frage kommt, nein ich kann die neue nicht einfach nehmen, die alte ist zu sehr mit dem rest der DB verzweigt
schonmal vielen Dank
ich habe leider keine Kategorie für SQL oder SQl Server fragen gefunden daher hier im Allgemein Thread.
Nun zu meiner Herausforderung:
Ich habe einen SQL EXPRESS Server und das MS SQL Server Managment Studio (SSMS V18.7)
in einer Tabelle mit namen M_MATERIAL stehen Tausende Produkte, mit Beschreibungen und Preise, uvm.
Diese Informationen hab ich mir in eine Excel Datei Kopiert und komplett Überarbeitet.
So wie Ihr euch denken könnt möchte ich jetzt die geänderten Werte zurück in die Haupttabelle schreiben lassen.
Ich habe es zuerst mit Bulk Import probiert, da bekomm ich aber ständig Datenkonvertierungs fehlermeldungen die ich nicht weg bekomme.
Jetzt dachte ich mir , wenn das mit dem Bulk Import nicht Funktioniert, Importierst du einfach die CSV in eine 2. Tabelle und versuchst die HauptTabelle M_Material mit den werten der Importen CSV und neu erstellten Tabelle "M_MAT" zu überrschreiben/Updaten.
Im endeffekt will ich das ALLE Daten von "M_MAT" in "M_MATERIAL" Kopiert werden und am besten die vorhanden überschrieben werden.
Leider finde ich nur Anleitungen wo man nur 1 Preis aktualliseren würde. das hilft mir aber nicht da ich 50 Spalten und Tausende Zeilen habe.
Bisher hab ich das so geschrieben, da bekomm ich aber die Fehlermeldung, ich weiss auch nicht ob ich eine WHERE bedingung mit schreiben MUSS ?
" Msg 8102, Level 16, State 1, Line 1 Die MAT_ID-Identitätsspalte kann nicht aktualisiert werden."
UPDATE dbo.M_MATERIAL
SET dbo.M_MATERIAL.MAT_ID = dbo.M_MAT.MAT_ID
FROM dbo.M_MAT
INNER JOIN dbo.M_MATERIAL
ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID)
also falls jemand eine idee hat wie ich die Daten aus einer TXT oder Excel Datei oder wie grad beschrieben von einer Tabelle in die andere, dann immer gern raus damit
Ärgere mich seit Tagen damit rum.
Ps bevor die Frage kommt, nein ich kann die neue nicht einfach nehmen, die alte ist zu sehr mit dem rest der DB verzweigt
schonmal vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 645126
Url: https://administrator.de/forum/hilfe-ms-sql-tabelle-updaten-645126.html
Ausgedruckt am: 10.04.2025 um 00:04 Uhr
5 Kommentare
Neuester Kommentar
Moin,
Du weisst aber schon, was hier passiert?
Du willst die ID aus deiner Produktivtabelle mit der ID aus deiner Temporären-Tabelle überschreiben. Kein WUnder, dass der SQL-Server da meckert. Immerhin existieren hier (vermutlich!?) Fremd-/ Primäreschlüsselbeziehungen.
theoretisch musst du für jede Spalte (deiner 50) ein Set erstellen:
ich gehe einmal davon aus, dass deine IDs in beiden Spalten identisch sind.
Also das die ID 4711 der Prod-Tabelle auch zum richtigen Eintrag (ID = 4711) in der Temp-Tabelle gehört!?
Gruß
em-pie
Zitat von @Sebastian-B:
[..]
UPDATE dbo.M_MATERIAL
SET dbo.M_MATERIAL.MAT_ID = dbo.M_MAT.MAT_ID
FROM dbo.M_MAT
INNER JOIN dbo.M_MATERIAL
ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID)
[..]
UPDATE dbo.M_MATERIAL
SET dbo.M_MATERIAL.MAT_ID = dbo.M_MAT.MAT_ID
FROM dbo.M_MAT
INNER JOIN dbo.M_MATERIAL
ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID)
Du weisst aber schon, was hier passiert?
Du willst die ID aus deiner Produktivtabelle mit der ID aus deiner Temporären-Tabelle überschreiben. Kein WUnder, dass der SQL-Server da meckert. Immerhin existieren hier (vermutlich!?) Fremd-/ Primäreschlüsselbeziehungen.
theoretisch musst du für jede Spalte (deiner 50) ein Set erstellen:
UPDATE dbo.M_MATERIAL
SET dbo.M_MATERIAL.Spalte2 = dbo.M_MAT.Spalte2
, dbo.M_MATERIAL.Spalte3 = dbo.M_MAT.Spalte3
, dbo.M_MATERIAL.Spalte4 = dbo.M_MAT.Spalte4
...
, dbo.M_MATERIAL.Spalte50 = dbo.M_MAT.Spalte50
FROM dbo.M_MAT
INNER JOIN dbo.M_MATERIAL
ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID)
ich gehe einmal davon aus, dass deine IDs in beiden Spalten identisch sind.
Also das die ID 4711 der Prod-Tabelle auch zum richtigen Eintrag (ID = 4711) in der Temp-Tabelle gehört!?
Gruß
em-pie
Die Updates werden mit dem SET gemacht, d.h. hier müssen die einzelnen Spalten aufgeführt werden (aber ohne die ID)
mit dem INNER JOIN dbo.M_MATERIAL ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID) wird die Verknüpfung zwischen den beiden Tabellen hergestellt, d.h. er aktualsiert die definierten Spalten für alle Zeilen wo die ID zusammenpasst
mit dem INNER JOIN dbo.M_MATERIAL ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID) wird die Verknüpfung zwischen den beiden Tabellen hergestellt, d.h. er aktualsiert die definierten Spalten für alle Zeilen wo die ID zusammenpasst
Scheinbar hast du die Syntax eines Update-Befehlt noch nicht verstanden.
Ebenso, wie ein JOIN aufgebaut ist
Vorher macht das keinen Sinn...
Du wolltest in deinem ersten Statement den Primärschlüssel überschreiben. an diesem hängen vermutlich aber noch andere Tabellen
Das wiederum habe ich nicht gemacht.
Die ID beider Tabellen bleibt bei mir unverändert.
Ebenso, wie ein JOIN aufgebaut ist
Vorher macht das keinen Sinn...
Du wolltest in deinem ersten Statement den Primärschlüssel überschreiben. an diesem hängen vermutlich aber noch andere Tabellen
Das wiederum habe ich nicht gemacht.
Die ID beider Tabellen bleibt bei mir unverändert.
Guten Morgen,
wenn Du die Datensätze komplett ersetzen willst, dann mach das doch am einfachsten so:
- exportieren (Wichtig: komplette Zeile inclusive der ID-Spalten/Schlüsselspalten)
- extern bearbeiten
- in Tabelle diese Zeilen löschen
- die bearbeiteten Zeilen importieren mit "SET IDENTITY_INSERT ON"-Option
(geht auch über den Assistenten im SSMS)
Mit dieser Option kannst Du ein INSERT mit Schlüsselspalten-Spalten erledigen.
Damit kann man z.Bsp. Zeilen einfügen um "Schlüssel-Lücken" zu vermeiden.
ACHTUNG: Darauf achten, dass dadurch keine "doppelten" Schlüssel entstehen, bei Spalten die Unique sein müssen.
Ach so, selbstverständlich vorher: Backup der Tabelle/Datenbank !
VG
Frank
wenn Du die Datensätze komplett ersetzen willst, dann mach das doch am einfachsten so:
- exportieren (Wichtig: komplette Zeile inclusive der ID-Spalten/Schlüsselspalten)
- extern bearbeiten
- in Tabelle diese Zeilen löschen
- die bearbeiteten Zeilen importieren mit "SET IDENTITY_INSERT ON"-Option
(geht auch über den Assistenten im SSMS)
Mit dieser Option kannst Du ein INSERT mit Schlüsselspalten-Spalten erledigen.
Damit kann man z.Bsp. Zeilen einfügen um "Schlüssel-Lücken" zu vermeiden.
ACHTUNG: Darauf achten, dass dadurch keine "doppelten" Schlüssel entstehen, bei Spalten die Unique sein müssen.
Ach so, selbstverständlich vorher: Backup der Tabelle/Datenbank !
VG
Frank