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 XML insert-update in einer MS SQL DB

Mitglied: teslajr

teslajr (Level 1) - Jetzt verbinden

28.10.2015, aktualisiert 30.10.2015, 888 Aufrufe, 8 Kommentare, 1 Danke

Hallo Leute

Mein Code zum importieren einer xml in die MS SQL 2008 DB funktioniert, jedoch möchte ich dass die Daten bei bestehenden auch ein update machen und diese überschreiben.

wie müsste ein update aussehen?
(ich habe vieles ausprobiert, aber komme nicht weiter)

use testDB
declare @xmldata xml

set quoted_identifier on

set @xmldata=(select CONVERT(xml, bulkcolumn) as bulkcolumn
from openrowset(bulk 'd:\export.xml', single_blob)as x)

insert into dbo.testTableA
select Tab.Col.query('.').value('(/Mitarbeiter/Mitarbeiter-Nr.) [1]', 'varchar (50)') as mid,
Tab.Col.query('.').value('(/Mitarbeiter/Nachname) [1]', 'varchar (50)') as nachname,
Tab.Col.query('.').value('(/Mitarbeiter/Vorname) [1]', 'varchar (50)') as vorname,
Tab.Col.query('.').value('(/Mitarbeiter/Manager) [1]', 'varchar (50)') as manager,
Tab.Col.query('.').value('(/Mitarbeiter/SamAccountName) [1]', 'varchar (50)') as SamAccountName
from @xmldata.nodes('/Personal/Mitarbeiter') Tab (Col)
left join dbo.testTableA as z
on Tab.Col.query('.').value('(/Mitarbeiter/Mitarbeiter-Nr.) [1]', 'varchar (50)') = z.mid
and Tab.Col.query('.').value('(/Mitarbeiter/Nachname) [1]', 'varchar (50)') = z.name
and Tab.Col.query('.').value('(/Mitarbeiter/Vorname) [1]', 'varchar (50)') = z.vorname
and Tab.Col.query('.').value('(/Mitarbeiter/Manager) [1]', 'varchar (50)') = z.manager
and Tab.Col.query('.').value('(/Mitarbeiter/SamAccountName) [1]', 'varchar (50)') = z.SamAccountName
where z.mid is null

Danke & Gruss
Mitglied: MadMax
LÖSUNG 28.10.2015, aktualisiert 30.10.2015
Hallo teslajr,

damit sollte das gehen:
01.
merge	testTableA t
02.
using	(
03.
	select Tab.Col.query('.').value('(/Mitarbeiter/Mitarbeiter-Nr.) [1]', 'varchar (50)') as mid,
04.
	Tab.Col.query('.').value('(/Mitarbeiter/Nachname) [1]', 'varchar (50)') as nachname,
05.
	Tab.Col.query('.').value('(/Mitarbeiter/Vorname) [1]', 'varchar (50)') as vorname,
06.
	Tab.Col.query('.').value('(/Mitarbeiter/Manager) [1]', 'varchar (50)') as manager,
07.
	Tab.Col.query('.').value('(/Mitarbeiter/SamAccountName) [1]', 'varchar (50)') as SamAccountName
08.
	from xmldata.nodes('/Personal/Mitarbeiter') Tab (Col)
09.
	) x on x.mid = t.mid
10.
when matched then update
11.
	set	nachname = x.nachname,
12.
		vorname = x.vorname,
13.
		manager = x.manager,
14.
		SamAccountName = x.SamAccountName
15.
when not matched by target then insert
16.
	(mid, nachname, vorname, manager, SamAccountName)
17.
	values (x.mid, x.nachname, x.vorname, x.manager, x.SamAccountName);
Achja, nochwas: bevor ich dieses sperrige XML mehrmals verwende, würde ich das lieber in eine temporäre Tabelle schieben und dann mit der weitermachen.

Gruß, Mad Max
Bitte warten ..
Mitglied: teslajr
30.10.2015 um 08:20 Uhr
Vielen Dank Max, dein Code löst mein Update Problem

Danke & Gruss
Bitte warten ..
Mitglied: teslajr
30.10.2015 um 15:21 Uhr
Etwas hätte ich noch...ich bekomme eine logische Fehlermeldung:
Der Wert NULL kann in die 'TaetigkeitID'-Spalte, 'testDB.dbo.testTableA'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei UPDATE.

wenn ich nur nachname und vorname update, wie kann ich es umgehen, dass felder welche einen wert verlangen nicht meckern?
(ohne die tabelle zu ändern, dass das feld auch ohne einen wert erstellt wird)

Danke & Gruss
Bitte warten ..
Mitglied: MadMax
30.10.2015 um 19:05 Uhr
Hallo teslajr,

das bekommst Du mit isnull (x.nachname, '') z.B. für den Nachnamen.

Gruß, Mad Max
Bitte warten ..
Mitglied: teslajr
02.11.2015 um 16:36 Uhr
Hallo Max

bin wieder am kämpfen, wo frage/setze ich dieses ISNULL?
habe schon alles versucht, ohne Erfolg.

Frage ich das beim einlesen der XML ab oder am schluss beim insert?

01.
use testDB
02.
declare @xmldata xml
03.

04.
set quoted_identifier on
05.

06.
set @xmldata=(select CONVERT(xml, bulkcolumn) as bulkcolumn
07.
from openrowset(bulk '\\Server\export$\export.xml', single_blob)as x)
08.

09.
merge	Person t
10.
using	(
11.
	select Tab.Col.query('.').value('(/Mitarbeiter/Personalnummer) [1]', 'varchar (50)') as PersonalNummer,
12.
	Tab.Col.query('.').value('(/Mitarbeiter/Nachname) [1]', 'varchar (50)') as nachname,
13.
	Tab.Col.query('.').value('(/Mitarbeiter/Vorname) [1]', 'varchar (50)') as vorname,
14.
	Tab.Col.query('.').value('(/Mitarbeiter/Initialen) [1]', 'varchar (50)') as kurzzeichen
15.
	from @xmldata.nodes('/Personal/Mitarbeiter') Tab (Col)
16.
	) x on x.PersonalNummer = t.PersonalNummer
17.
when matched then update
18.
	set	name = x.nachname,
19.
		vorname = x.vorname,
20.
		kurzzeichen = x.kurzzeichen
21.
when not matched by target then insert
22.
	(PersonalNummer, name, vorname, kurzzeichen)
23.
	values ( x.PersonalNummer, x.nachname, x.vorname, x.kurzzeichen);

Danke & Gruss
Bitte warten ..
Mitglied: MadMax
02.11.2015 um 20:52 Uhr
Moin teslajr,

in Deinem Fall geht es an beiden Stellen. isnull prüft, ob der erste Wert NULL ist und gibt in dem Fall den zweiten Wert zurück. Ist auch alles in der Hilfe beschrieben, da sollte man als erstes mal reinschauen bei Problemen.

Für Deinen Befehl habe ich es mal beim insert/update für den Nachnamen angegeben:
01.
use testDB
02.
declare @xmldata xml
03.

04.
set quoted_identifier on
05.

06.
set @xmldata=(select CONVERT(xml, bulkcolumn) as bulkcolumn
07.
from openrowset(bulk '\\Server\export$\export.xml', single_blob)as x)
08.

09.
merge	Person t
10.
using	(
11.
	select Tab.Col.query('.').value('(/Mitarbeiter/Personalnummer) [1]', 'varchar (50)') as PersonalNummer,
12.
	Tab.Col.query('.').value('(/Mitarbeiter/Nachname) [1]', 'varchar (50)') as nachname,
13.
	Tab.Col.query('.').value('(/Mitarbeiter/Vorname) [1]', 'varchar (50)') as vorname,
14.
	Tab.Col.query('.').value('(/Mitarbeiter/Initialen) [1]', 'varchar (50)') as kurzzeichen
15.
	from @xmldata.nodes('/Personal/Mitarbeiter') Tab (Col)
16.
	) x on x.PersonalNummer = t.PersonalNummer
17.
when matched then update
18.
	set	name = isnull (x.nachname, ''),
19.
		vorname = x.vorname,
20.
		kurzzeichen = x.kurzzeichen
21.
when not matched by target then insert
22.
	(PersonalNummer, name, vorname, kurzzeichen)
23.
	values ( x.PersonalNummer, isnull (x.nachname, ''), x.vorname, x.kurzzeichen);
Bitte warten ..
Mitglied: teslajr
03.11.2015, aktualisiert um 09:21 Uhr
Guten Morgen Max

Vielen Dank für deine Hilfe, die Funktion isnull() habe ich schon verstanden, aber im Zusammenhang mit dem XML Import nicht.
Denn ich bekomme den Error dass die TaetigkeitID leer ist: Der Wert NULL kann in die 'TaetigkeitID'-Spalte, 'testDB.dbo.testTableA'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu.

In der XML gibt es diese Spalte nicht, nur in der Tabelle, deswegen weiss ich nicht wo ich isnull(TaetigkeitID,'') machen soll?

01.
when matched then update
02.
	set	name = x.nachname,
03.
		vorname = x.vorname,
04.
		taetigkeitID = isnull(x.taetigkeitID, ''),
05.
		kurzzeichen = x.kurzzeichen		
06.
when not matched by target then insert
07.
	(taetigkeitID, PersonalNummer, name, vorname, kurzzeichen)
08.
	values (isnull(x.taetigkeitID,''), x.PersonalNummer,  x.nachname, x.vorname, x.kurzzeichen);



Danke & Gruss
Bitte warten ..
Mitglied: MadMax
03.11.2015 um 12:19 Uhr
Hallo teslajr,

ok, jetzt versteh ich Dein Problem.

Du kannst da auch Variable oder Konstante setzen und mußt Dich nicht nur auf die Daten, die bei "using" stehen, beziehen. Da im Import scheinbar keine TaetigkeitID enthalten ist, brauchst Du das isnull dann auch nicht.

Ob Du beim Update die TaetigkeitID zurücksetzen mußt, weiß ich nicht, ansonsten kannst Du sie auch weglassen.

Beim Insert kannst Du statt Deines "isnull(x.taetigkeitID,'')" dann einfach eine 0 oder 1 oder sonstwas setzen. Oder eine Variable, in der irgendein ermittelter Standardwert dafür steht.

Also z.B.:
01.
when matched then update
02.
	set	name = x.nachname,
03.
		vorname = x.vorname,
04.
		kurzzeichen = x.kurzzeichen		
05.
when not matched by target then insert
06.
	(taetigkeitID, PersonalNummer, name, vorname, kurzzeichen)
07.
	values (0, x.PersonalNummer,  x.nachname, x.vorname, x.kurzzeichen);
oder
01.
when matched then update
02.
	set	name = x.nachname,
03.
		vorname = x.vorname,
04.
		taetigkeitID = @taetigkeitID,
05.
		kurzzeichen = x.kurzzeichen		
06.
when not matched by target then insert
07.
	(taetigkeitID, PersonalNummer, name, vorname, kurzzeichen)
08.
	values (@taetigkeitID, x.PersonalNummer,  x.nachname, x.vorname, x.kurzzeichen);
Gruß, Mad Max
Bitte warten ..
Ähnliche Inhalte
Datenbanken
MS SQL DB-Daten archivieren?
gelöst Frage von SchelinhoDatenbanken16 Kommentare

Hallo zusammen! Ich habe eine Anwendung, welche MSSQL (SQL Server 2014 SP2) nutzt. Auf der DB-Instanz laufen diverse Datenbanken. ...

Windows Server

MS SQL 2008 - Insert mit Duplikat-Kontrolle

Frage von TlBERlUSWindows Server4 Kommentare

Hallo Zusammen, ich muss von einer Sicht/View in eine Tabelle innerhalb einer anderen Datenbank eintragen. Mein Problem ist, dass ...

Windows Server

MS SQl DB 2014 Backup Task

gelöst Frage von winlinWindows Server2 Kommentare

Hi Es gibt ja viele cmdlets zum sichern der SQL DB. Ist es über Tasks->Backup im SQL Manager nicht ...

Datenbanken

Datenänderungen in DB an einem MS SQL 2012 nachverfolgen?

gelöst Frage von AdminKnechtDatenbanken6 Kommentare

Hallo zusammen, ich arbeite mich zur Zeit in Dynamics NAV 2013 R2 und der dazugehörenden DB auf einem MS ...

Neue Wissensbeiträge
Humor (lol)

"Linux und 5 Gründe Warum man kein Windows verwenden sollte sondern Ubuntu Linux"

Tipp von Snowbird vor 12 StundenHumor (lol)8 Kommentare

Gerade gefunden. Ja, ist etwas älter, aber irgendwie lustig?

Humor (lol)

"Warum Linux in einer vernetzten Welt einfach keinen Komfort bietet!"

Tipp von Snowbird vor 1 TagHumor (lol)13 Kommentare

Ein interessanter Einblick warum Linux nichts für Geräteübergreifende Arbeit ist :)

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von Lochkartenstanzer vor 1 TagHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Windows Update

KB4517297 verfügbar, behebt Fehler in VB6 VBA VBScript

Information von sabines vor 1 TagWindows Update

Das Update behebt mögliche Fehler in VB6, VBA und VBScript, die durch das Update KB4512486 vom August entstanden sind. ...

Heiß diskutierte Inhalte
Router & Routing
Deinstalliertes Geräte wird in FritzBox noch immer als verbundenes Gerät angezeigt
gelöst Frage von imebroRouter & Routing18 Kommentare

Hallo, in meiner FritzBox 7490 wird im Bereich "Funknetz" ein Gereät bei den verbundenen Geräten angezeigt, wobei ich nicht ...

Batch & Shell
PowerShell - Text an HTMLbody übergeben mit UTF-8 Kodierung
Frage von Pat.batBatch & Shell14 Kommentare

Hallo zusammen, ich stoße momentan auf folgendes Problem. Ich möchte mit meinem Skript E-Mails versenden. Text und Signatur samt ...

Sonstige Systeme
Ist es möglich ein ISDN-Telefon an einen analogen Anschluss anzuschließen?
Frage von cramtroniSonstige Systeme14 Kommentare

Also anders herum geht es ja, da gibt es ja diese Adapter von RJ11 auf TAE-F, aber gibt es ...

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von LochkartenstanzerHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...