sebastian-b
Goto Top

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 face-big-smile
Ä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

Content-ID: 645126

Url: https://administrator.de/forum/hilfe-ms-sql-tabelle-updaten-645126.html

Ausgedruckt am: 10.04.2025 um 00:04 Uhr

em-pie
em-pie 27.01.2021 um 15:40:53 Uhr
Goto Top
Moin,
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)

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
Sebastian-B
Sebastian-B 27.01.2021 aktualisiert um 16:02:18 Uhr
Goto Top
Halo EM-PI und danke für deine Antwort,
das hab ich mir fast gedacht das ich wirklich alle 50 Spalten da eintragen muss ..... das wollt ich eingentlich verhindern face-sad

aber du hast doch jetzt genau den selben code wie ich, nur die spalten erweitert.?
somit hab ich doch das selbe problem *grübel* und die fehlermeldung wegen den Schlüsseln ?

vorallem kann ON (dbo.M_MATERIAL.MAT_ID = M_MAT.MAT_ID) ja auch nicht richtig sein ? das ist ja nur 1 Spalte die er dann ersetzt ?
oder müsste ich dann ebenfalls

UPDATE dbo.M_MATERIAL
SET dbo.M_MATERIAL.Spalte2 = dbo.M_MAT.Spalte2
...
, 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),
ON (dbo.M_MATERIAL.spalte2 = M_MAT.spalte2)
ON (dbo.M_MATERIAL.spalte50 = M_MAT.spalte50)
doern.digital
Lösung doern.digital 27.01.2021 um 16:48:51 Uhr
Goto Top
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
em-pie
em-pie 27.01.2021 um 17:11:29 Uhr
Goto Top
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.
SachsenHessi
SachsenHessi 28.01.2021 aktualisiert um 10:09:59 Uhr
Goto Top
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