globetrotter
Goto Top

MSSQL SQL-Syntax Update Case IF ELSE

Hallöchen...

arbeite unter MSSQL2K SP4 und möchte via DTS dieses Script ausführen. Da ich in Sachen SQL nicht sehr tief drin bin kann es schon sein, dass sowas gar nicht gehen kann. Ursprünglich enstand diese Idee aus folgendem Script:

Update Table
Set Column2 = Case When Column1 Is NULL
Then 'F'
Else 'O'
End

Mein Script:

Update dbo.UPSTRANSFER
Set dbo.UPSTRANSFER.LieferAnrede = Case When dbo.UPSTRANSFER.A1Anrede Is NULL Then 'dbo.UPSTRANSFER.A0Anrede',
dbo.UPSTRANSFER.LieferName1 = dbo.UPSTRANSFER.A0Name1,
dbo.UPSTRANSFER.LieferName2 = dbo.UPSTRANSFER.A0Name2,
dbo.UPSTRANSFER.LieferStrasse = dbo.UPSTRANSFER.A0Strasse,
dbo.UPSTRANSFER.LieferPLZ = dbo.UPSTRANSFER.A0PLZ,
dbo.UPSTRANSFER.LieferOrt = dbo.UPSTRANSFER.A0Ort,
dbo.UPSTRANSFER.LieferLand = dbo.UPSTRANSFER.A0Land,
dbo.UPSTRANSFER.LieferNNBetrag = dbo.UPSTRANSFER.Bruttobetrag
Else
dbo.UPSTRANSFER.A0Anrede,
dbo.UPSTRANSFER.LieferName1 = dbo.UPSTRANSFER.A1Name1,
dbo.UPSTRANSFER.LieferName2 = dbo.UPSTRANSFER.A1Name2,
dbo.UPSTRANSFER.LieferStrasse = dbo.UPSTRANSFER.A1Strasse,
dbo.UPSTRANSFER.LieferPLZ = dbo.UPSTRANSFER.A1PLZ,
dbo.UPSTRANSFER.LieferOrt = dbo.UPSTRANSFER.A1Ort,
dbo.UPSTRANSFER.LieferLand = dbo.UPSTRANSFER.A1Land,
dbo.UPSTRANSFER.LieferNNBetrag = dbo.UPSTRANSFER.Bruttobetrag
End;

Muss ich nun wirklich für jedes Feld ein eigenes Update schreiben oder was würdet Ihr machen ?
Mit diesem Script sollen alle 2 Minuten ca. 2000 Datensätze aktualisiert werden welche in diese Tabelle 'reingeblasen* werden.

Danke für Eure Tips...

GlobeTrotter

Content-Key: 100665

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

Printed on: April 19, 2024 at 14:04 o'clock

Member: problemsolver
problemsolver Oct 31, 2008 at 07:50:51 (UTC)
Goto Top
Hi Globetrotter und Willkommen im Forum face-smile

ich verstehe nicht so 100%tig Dein Anliegen... Aber so wie es ausschaut, wären eventuell Trigger etwas für Dich...

Zum reinschnuppern, falls Du hiervon noch nichts gehört hast... http://derentwickler.de/itr/features/psecom,id,168,nodeid,77.html

Es gibt sicherlich noch mehr Seiten zu diesem Thema.

Falls ich gar nicht den Nerv getroffen habe, bitte ich/wir um Konkretisierung deines Problems.

Gruß

Markus
Member: Globetrotter
Globetrotter Oct 31, 2008 at 08:14:22 (UTC)
Goto Top
Hallo Markus,

danke für Deine Hilfe.

Deine Triggerlösung ist natürlich interessant - jedoch sollte ich damit erst ausgiebig testen bevor ich damit auf das Produktivsystem gehe...
Bisher sieht mein script nun so aus und funktioniert auch. Das Problem ist nur, dass man dies eigentlich in einem Rutsch erledigen sollte:


Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferAnrede = Case When dbo.UPSTRANSFER.A1Anrede Is NULL Then 'dbo.UPSTRANSFER.A0Anrede' Else 'dbo.UPSTRANSFER.A1Anrede' End;

Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferName1 = Case When dbo.UPSTRANSFER.A1Name1 Is NULL Then 'dbo.UPSTRANSFER.A0Name1' ELSE 'dbo.UPSTRANSFER.A1Name1' End;

Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferName2 = Case When dbo.UPSTRANSFER.A1Name2 Is NULL Then 'dbo.UPSTRANSFER.A0Name2' ELSE 'dbo.UPSTRANSFER.A1Name2' End;

Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferStrasse = Case When dbo.UPSTRANSFER.A1Strasse Is NULL Then 'dbo.UPSTRANSFER.A0Strasse' ELSE 'dbo.UPSTRANSFER.A1Strasse' End;

Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferPLZ = Case When dbo.UPSTRANSFER.A1PLZ Is NULL Then 'dbo.UPSTRANSFER.A0PLZ' ELSE 'dbo.UPSTRANSFER.A1PLZ' End;
Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferOrt = Case When dbo.UPSTRANSFER.A1Ort Is NULL Then 'dbo.UPSTRANSFER.A0Ort' ELSE 'dbo.UPSTRANSFER.A1Ort' End;

Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferLand = Case When dbo.UPSTRANSFER.A1Land Is NULL Then 'dbo.UPSTRANSFER.A0Land' ELSE 'dbo.UPSTRANSFER.A1Land' End;
Update dbo.UPSTRANSFER Set dbo.UPSTRANSFER.LieferNNBetrag = 'dbo.UPSTRANSFER.Bruttobetrag'


Gruss Matze
Wenn jwmand eine elegantere und vorallem performantere Lösung parat hätte wäre ich sehr dankbar!

Es handelt sich hierbei um das einsetzen der Lieferanschrift. Wenn abweichende Lieferanschrift vorhanden, soll er diese nehmen - ansonsten die Rechnungsanschrift. Viel lieber wäre mir aber wenn es Möglich wäre, dass man A0Anrede abfrägt - wenn diese nicht NULL ist - soll er alle Werte von A0xxx nehmen - ansonsten die Werte von A1xxx.
Member: MadMax
MadMax Oct 31, 2008 at 09:59:34 (UTC)
Goto Top
Hallo Matze,

die vielen Updates könnte man ersetzen durch:
update	UPSTRANSFER
set	LieferAnrede = IsNull (A1Anrede, A0Anrede),
	LieferName1 = IsNull (A1Name1, A0Name1),
	LieferName2 = IsNull (A1Name2, A0Name2),
	...

Was Du in Deinem Nachsatz geschrieben hast würde gelöst durch:
update	UPSTRANSFER
set	LieferAnrede = A0Anrede,
	LieferName1 = A0Name1,
	LieferName2 = A0Name2,
	...
where	A0Anrede is not null

update	UPSTRANSFER
set	LieferAnrede = A1Anrede,
	LieferName1 = A1Name1,
	LieferName2 = A1Name2,
	...
where	A0Anrede is null
oder
update	UPSTRANSFER
set	LieferAnrede = case when A0Anrede is null then A1Anrede else A0Anrede end,
	LieferName1 = case when A0Anrede is null then A1Name1 else A0Name1 end,
	LieferName2 = case when A0Anrede is null then A1Name2 else A0Name2 end,
	...
Welche der beiden Lösungen schneller ist kann ich nicht genau sagen, ich nehme an die zweite.

Prüf aber nochmal nach, was Du willst. Dein momentanes Skript prüft nach, ob die A1-Werte NULL sind, was auch Deinem ersten Beitrag entspricht. Dein Nachsatz im vorigen Beitrag geht aber auf eine Prüfung von A0Anrede.

Gruß, Mad Max
Member: Biber
Biber Oct 31, 2008 at 10:24:01 (UTC)
Goto Top
Moin Globetrotter,

unbeachtet der sauberen handwerklichen Umsetzung durch Mad Max ist das Konzept totale Grütze, da Du so oder so jeweils ein redundantes Feld-Pärchen mit identischem Inhalt in jedem Datensatz hast.

Welchen sittlichen Nährwert haben denn die Felder "LieferAnrede", "Liefername",...??
Deren Inhalte lassen sich doch immer aus A0bla/A1bla ableiten -
... also warum spreichern?

Mach das beim Select-Zugriff (z.B. beim Rechnungsschreiben) oder verwende die IFNull()-Mimik in einem View mit den-LieferXXX-Feldern als errechneten Feldern.

Beim Versuch, diese redundante Tabellenstruktur produktiv zu setzen würdest Du sonst eh von Euren DBAs vom Hof gejagt werden. face-wink

Grüße
Biber
Member: Globetrotter
Globetrotter Oct 31, 2008 at 11:35:54 (UTC)
Goto Top
Servus Biber...
Danke für Deinen Kommentar ;)
Ich brauche diese bescheidene Tabelle um die Daten in UPS Worldship zu ziehen. Leider kann das UPS-Proggy keine logischen Verknüpfungen auf meine SQL-DB setzen, daher dieser Unfug.

Was spricht gegen eine Triggerlösung ?

Ich denke wenn man diese "sinnvoll" deklariert wäre 1. nicht so viel Traffic in der DB und 2. wäre es eine redundante Lösung, oder ?

Gruessle

Ps. und da ich nicht vom Hof gejagt werden will, hoffe ich, dass mir hier jemand DIE LÖSUNG bieten kann ;)
Member: Biber
Biber Oct 31, 2008 at 11:58:49 (UTC)
Goto Top
Moin Globetrotter,

Leider kann das UPS-Proggy keine logischen Verknüpfungen auf meine SQL-DB setzen,
Wie...? Würde dieses UPS-Geraffel merken, wenn Du ihm einen View unterjubelst statt die physische Struktur?
Aber sollte es so sein, dann ist es natürlich 27000mal sinnvoller, die Tabellenfelder beim INSERT/UPDATE via Trigger SATZweise anzupassen als einmal am Tag alle Datensätze neu zu arrangieren.
Das kann doch auch kein Anwender ernstfach erwarten, dass sich Datensätze im operativen Systen irgendwann nachts ändern, nachdem er am Bildschirm mittags gesagt hat "Daten so speichern wie angezeigt?"

Grüße
Biber
Member: Globetrotter
Globetrotter Oct 31, 2008 at 12:11:55 (UTC)
Goto Top
Jo...
Da das Ding heute Nachmittag laufen muss werde ich erst einmal die 'Schlachtmethode' bis heute Abend laufen lassen. Übers Wochenende werde ich mich dann wohl mal mit den Triggern beschäftigen. Sobald dieses Dingens dann läuft werde ich das Script hier nochmal reinstellen und mir von Euch den Hintern versohlen lassen ;)

Gruesse Matze
Member: RottenSon667
RottenSon667 Aug 13, 2010 at 13:15:33 (UTC)
Goto Top
...und wie sah es nun aus? ich meine, das ganze ist ja nun auch lütt her.
Member: Globetrotter
Solution Globetrotter Apr 15, 2021 at 16:07:18 (UTC)
Goto Top
@RottenSon667
Kann ich Dir leider nicht mehr sagen ;)
Sorry..

Gruss Globe!