Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MSSQL-Update mit Bedingung und Tabellenvariablen

Frage Entwicklung Datenbanken

Mitglied: stoperror

stoperror (Level 1) - Jetzt verbinden

07.12.2009, aktualisiert 08.12.2009, 7307 Aufrufe, 5 Kommentare

Ich möchte eigentlich eine Tabellenvariable und keine temporäre Tabelle für ein Update benutzen. Aber das funktioniert nicht

Hallo zusammen,

Ich möchte ein bedingtes Update auf eine Tabellenvariable machen. Aber ich weiss leider nicht, wo mein Fehler liegt.
Mit einer temporären Tabelle funktioniert es übrigens.

Sorry, mir ist da bei der Ersetzung meines Realproblems durch Dummybezeichnungen für Tabellen und Spalten ein Fehler unterlaufen. Ich hab ihn jetzt korrigiert.

Zur Erläuterung:
1. @myid ist eine Variable

2.In der Tabelle #test, @tablevariable gibt es auch eine Spalte mit der Bezeichnung myid

3. Wenn es in der zweiten Tabelle myidtable 0 Datensätze gibt, deren Spalte "secondid" mit der Spalte "secondid" in der Tabellenvariablen übereinstimmen und wo gleichzeitig die Spalte myid den Wert der Variable @myid hat, dann schreib "-1" in die Spalte "myid" der Tabellenvariablen ansonsten übernimm den Wert aus der Variablen @myid.

Das funktioniert:

UPDATE #test
SET myid =
CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = #test.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END





Versuche ich dasselbe mit einer Tabellenvariablen, dann bekomme ich die Fehlermeldung:

Must declare the scalar variable "@tempcharsql2".

UPDATE @tablevariable
SET myid = CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = @tempcharsql2.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END

verzichte ich auf @tempcharsql2 und schreibe nur secondid dann wird in alle Datensätze, ob sie nun in der zweiten Tabelle einen entsprechenden Treffer haben oder nicht, der Wert auf @myid gesetzt.

3. Versuch:

Update @tablevariable
SET myid =
CASE (select count(myidtable.myid) from myidtable, @tablevariable as p where myidtable.secondid = p.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END

jetzt kennt er zwar die Tabellenvariable, aber es werden immer noch alle Spalten upgedated, auch die, auf die die Bedingung gar nicht zutrifft....

Recht herzlichen Dank im Voraus für Eure Tipps!
Mitglied: Netzheimer
08.12.2009 um 11:19 Uhr
Hallo stoperror,

ich hoffe es liegt nicht an deinem Namen

Update @tablevariable
SET mylid =
CASE (select count(myidtable.myid) from table2, @tablevariable as p where myidtable.secondid = p.secondid and table2.myid = @myid)

SET mylid oder sollte es besser heißen SET @mylid? Im Else sprichst du die Variable ja auch mit @ an, dass wäre ja ein "Error"

Außerdem sollte (muss) man Variablen vor der Benutzung per declare definieren. Sieht aus, als würde er bei der temporären Tabelle eine Spalte mylid erzeugen und nicht eine Variable

Gruß
Netzheimer
Bitte warten ..
Mitglied: MadMax
08.12.2009 um 12:45 Uhr
Moin stoperror,

ehrlich gesagt kann ich mir bei keinem dieser Befehle vorstellen, daß er funktioniert. Du schmeißt da doch ganz wüst irgendwelche Namen durcheinander. Schon in dem angeblich funktionierenden SQL-Befehl werden zwei Spalten myidtable.myid und myidtable.secondid verwendet, aber es gibt gar keine Tabelle myidtable oder einen Tabellenalias myidtable.

Der große Unterschied zum zweiten Befehl ist dann, daß Du #test einmal durch @tablevariable ersetzt und einmal durch @tempcharsql2.

Vielleicht solltest Du ja mal mit dem kompletten Befehl inklusive Deiner Variablendeklaration rausrücken, sonst wird Dir kaum jemand helfen können.

Gruß, Mad Max
Bitte warten ..
Mitglied: stoperror
08.12.2009 um 14:26 Uhr
Da hast Du natürlich recht. Sorry, ich hatte mich bei der Ersetzung der Tabellen- und Spaltennamen durch Dummy-Bezeichnungen etwas verhaspelt.
Ich habe das jetzt im obigen Posting korrigiert und auch eine Beschreibung dazugeschrieben, was ich da eigentlich treibe.... bzw. versuche.
Danke für Eure Geduld.
Bitte warten ..
Mitglied: Biber
08.12.2009 um 18:58 Uhr
Moin stoperror,

auf die Gefahr hin, dass ich nur die Fragen von netzheimer und Mad Max geringfügig variiere...

Was findest du denn daran verwunderlich, dass du im zweiten Beispiel höflich aufgefordert wirst, doch bitte die Variable "@tempcharsql2" zu deklarieren?
Ich meine - ich hätte an der Stelle des Parsers/der Parserin auch nicht anders reagiert.

Oder gibt es noch irgendwelchen nebensächlichen Details, die du noch nicht erwähnt hast?

Grüße
Biber
Bitte warten ..
Mitglied: MadMax
09.12.2009 um 23:56 Uhr
01.
UPDATE @tablevariable 
02.
SET myid = CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = t.secondid and myidtable.myid = @myid) 
03.
WHEN 0 
04.
THEN -1 
05.
ELSE @myid 
06.
END 
07.
from @tablevariable t
Das nächste Mal solltest Du die Dummies lassen oder zumindest dafür sorgen, daß die Dummies nicht das eigentliche Problem verdecken. In Deinem Beitrag oben steht nämlich immer noch Müll (@tempcharsql2, s. Bibers Posting).

Gruß, Mad Max
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Doppelte Bedingungen für eine Update Batch
gelöst Frage von zeroblue2005Batch & Shell2 Kommentare

Hallo Zusammen, jetzt bastel ich schon schon ein paar Tage an einer Update Batch und Sie läuft auch wunderbar. ...

Windows Server
UPDATE: User-Berechtigungen fuer MSSQL
Frage von winlinWindows Server3 Kommentare

Hallöchen Leute, ich hatte schonmal einen Beitrag zum o.g. Thema gestellt und dafür einen hilfreichen Link erhalten: Hierzu hätte ...

Datenbanken
MSSQL CREATE TRIGGER after UPDATE,DELETE was heißt das
gelöst Frage von MarabuntaDatenbanken1 Kommentar

Hallo, ich habe zwei Versionen: CREATE TRIGGER td . tabelle1 ON td . tabelle2 after UPDATE CREATE TRIGGER td . tabelle1 ON td . tabelle2 after UPDATE, ...

Datenbanken
MSSQL quenquery
gelöst Frage von petereDatenbanken6 Kommentare

Hallo, ich stoße leider an die Grenzen meiner MSSQL-Kenntnisse. Ich muss diesen, eigentlich einfachen, UPDATE-Ausdruck via zwei Verbindungsserver-Verbindungen realisieren. ...

Neue Wissensbeiträge
Microsoft Office

Office 2010 Starter erneut auf einer frischen Windows-Version installieren

Tipp von Lochkartenstanzer vor 14 StundenMicrosoft Office2 Kommentare

Moin, vor ein paar Tagen schlug bei mir ein Kunde auf, der sein Widnows 7 geschrottet und es inklusive ...

Datenbanken

Upgrade MongoDB 3.4 auf 3.6

Erfahrungsbericht von Frank vor 16 StundenDatenbanken

Seit kurzem gibt es das 3.6 Update für die MongoDB: Sicherheit, das Sortieren, Aggregation und auch die Performance wurde ...

SAN, NAS, DAS

Backdoor Zugang und Upload-Bug in vielen Western Digital MyCloud Geräten

Information von Frank vor 17 StundenSAN, NAS, DAS2 Kommentare

James Bercegay von der Firma Gulftech hat die Fehler an Western Digital gemeldet und das Unternehmen stellt bereits ein ...

Microsoft Office

Outlook 2016 - Beim Weiterleiten keine PDF Anhänge mehr - KB4011626 entfernen

Erfahrungsbericht von Deepsys vor 20 StundenMicrosoft Office1 Kommentar

Wenn ihr feststellt das ihr beim Weiterleiten von E-Mails keine PDF Anhänge mehr versendent, dann dankt Microsoft. Diese tolle ...

Heiß diskutierte Inhalte
Windows Netzwerk
Drucker isolieren in Windows Domäne
gelöst Frage von lcer00Windows Netzwerk14 Kommentare

Hallo zusammen, habe eine Windows-AD (2012R2) in der es einen Druckerserver gibt. Mittlerweile verliere ich das Vertrauen in die ...

Server-Hardware
Veeam Backup Server stürzt alle paar Tage ab
Frage von Leo-leServer-Hardware12 Kommentare

Hallo Forum, ich habe momentan folgendes Problem. Veeam Backup and Replication 9.5 u2 auf voll gepatchten DL 380 G7 ...

Windows 10
Win10 Laptop findet keine Netzwerkgeräte und Freigaben mehr
Frage von CoolzeroWindows 1010 Kommentare

Hi, seit ein paar Tagen habe ich das Problem das mein Windows 10 Laptop keine Geräte mehr in der ...

Batch & Shell
Dateien verschieben mit batch
gelöst Frage von michi-ffmBatch & Shell10 Kommentare

Hallo Zusammen hat jemand evtl eine Idee? Zunächst hier das Skript: Leider werden keine UNC-Pfade unterstüzt, kann mir jemand ...