fischer-lum
Goto Top

MS SQL Update: Benötige Hilfe

Hi,

bin neu hier und habe ein kleines Problem mit meinem MS SQL (bin kein SQL Profi).

Wir versuchen bei uns in der Firma eine Tabelle mit knapp 12.000 Einträgen zu Updaten.

Wir lassen im Moment eine CSV Datei exportieren von einer anderen Software, diese wird dann in die Tabelle tmp eingelesen.

In der aktiven Calculate Tabelle sind Datensätze die so nicht mehr benutzt werden sollen, diese dürfen wir aber nicht einfach löschen, da sich alte Programme darauf beziehen könnten.

Unser Plan nun:
Die Spalte m_name soll am Anfang mit "U-" (für Ungültig) ergänzt werden.

Mein bisheriger Code:

Update TEST.dbo.Calculate_Copy set TEST.dbo.Calculate_Copy.m_name = "U-"+TEST.dbo.Calculate_Copy.m_name  

FROM
	TEST.dbo.Calculate_Copy 

where TEST.dbo.Calculate_Copy.m_id != TEST.dbo.tmp.m_id
; 

Dieser Code läuft normal durch bis er bei der letzten Zeile ankommt, dort wirft er den Fehler:

"Meldung 4104, Ebene 16, Status 1, Zeile 45
Der mehrteilige Bezeichner "TEST.dbo.tmp.m_id" konnte nicht gebunden werden."

(In der Datei ist mehr Code enthalten, dieser funktioniert aber bereits)

Über Hilfe würde ich mich sehr freuen!

Mfg,

Fischer-LuM

Content-Key: 558754

Url: https://administrator.de/contentid/558754

Printed on: April 27, 2024 at 03:04 o'clock

Member: ukulele-7
Solution ukulele-7 Mar 17, 2020 at 14:50:07 (UTC)
Goto Top
Versuch mal deine Spaltennamen etwas einzukürzen, in etwa so:
Update TEST.dbo.Calculate_Copy set Calculate_Copy.m_name = "U-"+Calculate_Copy.m_name  

FROM
	TEST.dbo.Calculate_Copy 

where Calculate_Copy.m_id != tmp.m_id
; 
Außerdem ist die Tabelle zur Spalte tmp.m_id nicht Bestandteil des Statements, das müsste wohl noch gejoint werden.
Member: Fischer-LuM
Fischer-LuM Mar 18, 2020 at 06:32:48 (UTC)
Goto Top
Danke für den Hinweis!

Habe den Code ergänzt mit einem INNER JOIN.

Code sieht nun wie folgt aus:

Update TEST.dbo.Calculate_Copy set Calculate_Copy.m_name = "U-" + Calculate_Copy.m_name  

FROM
	TEST.dbo.Calculate_Copy 
INNER JOIN TEST.dbo.tmp ON TEST.dbo.Calculate_Copy.m_id = TEST.dbo.tmp.m_id
WHERE Calculate_Copy.m_id != tmp.m_id
; 

(Ich schätze ich könnte die Spaltennamen da auch noch ein Stück kürzen, bin aber bei sowas nie ganz sicher wann ich kürzen sollte und wann lieber nicht)

Der Code wirft nun einen anderen Fehler auf:

"Meldung 207, Ebene 16, Status 1, Zeile 45
Ungültiger Spaltenname 'U-'."

Ich habe irgendwie das Gefühl, dass ich das ganze entweder viel zu kompliziert mache oder der Code einfach von hinten bis vorne nicht zu dem passt was wir machen möchten.

Über weitere Hilfe oder Vorschläge würde ich mich sehr freuen!
Member: Fischer-LuM
Fischer-LuM Mar 18, 2020 at 07:36:27 (UTC)
Goto Top
Nach langem hin und her haben wir endlich eine Lösung gefunden.

Anstelle eines Updates, welches alles macht haben wir nun dieses Update in einige kleine Blöcke aufgetrennt.

Nicht sonderlich übersichtlich oder elegant, aber funktioniert.

Hier der Code sollte jemand mal ein ähnliches Problem haben.

IF OBJECT_ID('TEST.dbo.tmp_2', 'U') IS NOT NULL DROP TABLE TEST.dbo.tmp_2;  


CREATE TABLE TEST.dbo.tmp_2
(
   m_id integer,
   m_name nvarchar(100),
   m_bezeichnung nvarchar(100),
   m_nameExt nvarchar(100),
   m_preis float,
   m_imageFile nvarchar(255),
   m_mengenEinheit integer,
);


INSERT INTO TEST.dbo.tmp_2(m_id, m_name, m_bezeichnung, m_nameExt, m_preis, m_imageFile, m_mengenEinheit)
SELECT m_id, m_name, m_bezeichnung, m_nameExt, m_preis, m_imageFile, m_mengenEinheit FROM TEST.dbo.Calculate_Copy WHERE m_id NOT IN (SELECT m_id FROM TEST.dbo.tmp);


Update TEST.dbo.tmp_2 set tmp_2.m_name = 'U - ' + tmp_2.m_name;  


Update TEST.dbo.Calculate_Copy set TEST.dbo.Calculate_Copy.m_name = TEST.dbo.tmp_2.m_name,
								   TEST.dbo.Calculate_Copy.m_bezeichnung = TEST.dbo.tmp_2.m_bezeichnung,
								   TEST.dbo.Calculate_Copy.m_nameExt = TEST.dbo.tmp_2.m_nameExt,
								   TEST.dbo.Calculate_Copy.m_preis = TEST.dbo.tmp_2.m_preis,
								   TEST.dbo.Calculate_Copy.m_imageFile = TEST.dbo.tmp_2.m_imageFile,
								   TEST.dbo.Calculate_Copy.m_mengenEinheit = TEST.dbo.tmp_2.m_mengenEinheit
FROM
	TEST.dbo.Calculate_Copy
INNER JOIN TEST.dbo.tmp_2 ON TEST.dbo.Calculate_Copy.m_id = TEST.dbo.tmp_2.m_id
WHERE TEST.dbo.Calculate_Copy.m_name != TEST.dbo.tmp_2.m_name
	  or TEST.dbo.Calculate_Copy.m_bezeichnung != TEST.dbo.tmp_2.m_bezeichnung
	  or TEST.dbo.Calculate_Copy.m_nameExt != TEST.dbo.tmp_2.m_nameExt
	  or TEST.dbo.Calculate_Copy.m_preis != TEST.dbo.tmp_2.m_preis
	  or TEST.dbo.Calculate_Copy.m_imageFile != TEST.dbo.tmp_2.m_imageFile
	  or TEST.dbo.Calculate_Copy.m_mengenEinheit != TEST.dbo.tmp_2.m_mengenEinheit
;

Mfg

Fischer-LuM
Member: ukulele-7
ukulele-7 Mar 18, 2020 at 08:09:24 (UTC)
Goto Top
Wenn das wirklich MSSQL ist nimmt 'U-' + spalte und nicht "U-" + spalte.

Der Ansatz passt schon wenn ich das richtig deute.
Member: MadMax
MadMax Mar 18, 2020 at 12:47:07 (UTC)
Goto Top
Hallo Fischer-LuM,

hab Dein Problem erst jetzt gesehen, wo es schon gelöst ist. Trotzdem für Dich zur Info, daß Du mit Deinem ursprünglichen Befehl gar nicht so weit von der Lösung entfernt warst, bzw. in Deiner jetzigen Lösung Deine zwei Fehler im Ursprungsbefehl vermieden hast.

Der erste Fehler war, daß Du die TEST.dbo.tmp.m_id verwendet hast, ohne die Tabelle eingebunden zu haben, das hast Du mit dem "NOT IN (SELECT m_id FROM TEST.dbo.tmp)" gelöst.

Der zweite Fehler waren die doppelten Anführungszeichen um das U-, da gehören einfache hin.

Und weil Du löblicherweise Deine Lösung für andere mit dem Problem hier reingeschrieben hast, hier noch die Lösung mit Deinem ursprünglichen Befehl:

Update TEST.dbo.Calculate_Copy set Calculate_Copy.m_name = 'U-'+Calculate_Copy.m_name  

FROM
	TEST.dbo.Calculate_Copy 

where Calculate_Copy.m_id NOT IN (SELECT m_id FROM TEST.dbo.tmp);

Gruß, Mad Max
Member: Fischer-LuM
Fischer-LuM Mar 24, 2020 at 06:06:14 (UTC)
Goto Top
Hallo MadMax,

Danke für diese doch deutlich kürzere Lösung.

Tut mir leid, dass ich erst jetzt antworte.

Haben mittlerweile auf deine Variante umgestellt, da sie auch deutlich weniger Zeit in Anspruch nimmt.

Gruß, Fischer-LuM