SQL Server Express - SQL Befehl
freshman2017 (Level 1) - Jetzt verbinden
09.12.2019, aktualisiert 09:24 Uhr, 820 Aufrufe, 7 Kommentare
Guten Morgen liebe Gemeinde,
nutze derzeit folgende Befehl, um eine Tabelle anzulegen und diese mit Daten aus einer Tabelle anzulegen:
Die .txt ist wie folgt aufgebaut:
Jetzt weiß ich nicht weiter, wie ich am besten den Befehl anpassen kann, dass er zu einem im...
...ersten Abschnitt prüft, ob die Tabelle TEST genau mit den angegeben Felder vorhanden ist, sonst sollen diese neu angelegt werden - falls neue Felder durch diesen Befehl hinzugefügt werden sollen...
...zweiten Abschnitt prüft, ob die Datensätze bereits vorhanden sind oder nicht - wenn diese nicht vorhanden sind, soll er diese einfügen...
nutze derzeit folgende Befehl, um eine Tabelle anzulegen und diese mit Daten aus einer Tabelle anzulegen:
IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='TEST')
CREATE TABLE TEST
(
ID INT,
Vorname VARCHAR(40),
Nachname VARCHAR(40)
)
GO
BULK INSERT TEST
FROM 'C:\ProgramData\TEST\test-1.txt' WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
GO
1;Max;Mustermann
2;Erika;Musterfrau
3;Hans;Mustermann
...ersten Abschnitt prüft, ob die Tabelle TEST genau mit den angegeben Felder vorhanden ist, sonst sollen diese neu angelegt werden - falls neue Felder durch diesen Befehl hinzugefügt werden sollen...
...zweiten Abschnitt prüft, ob die Datensätze bereits vorhanden sind oder nicht - wenn diese nicht vorhanden sind, soll er diese einfügen...
7 Antworten
- LÖSUNG SlainteMhath schreibt am 09.12.2019 um 11:15:27 Uhr
- LÖSUNG freshman2017 schreibt am 09.12.2019 um 12:02:10 Uhr
- LÖSUNG ukulele-7 schreibt am 10.12.2019 um 09:06:51 Uhr
- LÖSUNG freshman2017 schreibt am 10.12.2019 um 13:00:36 Uhr
- LÖSUNG SlainteMhath schreibt am 10.12.2019 um 13:07:14 Uhr
- LÖSUNG freshman2017 schreibt am 10.12.2019 um 14:03:50 Uhr
- LÖSUNG SlainteMhath schreibt am 10.12.2019 um 14:08:42 Uhr
- LÖSUNG freshman2017 schreibt am 10.12.2019 um 14:03:50 Uhr
- LÖSUNG SlainteMhath schreibt am 10.12.2019 um 13:07:14 Uhr
- LÖSUNG freshman2017 schreibt am 10.12.2019 um 13:00:36 Uhr
- LÖSUNG ukulele-7 schreibt am 10.12.2019 um 09:06:51 Uhr
- LÖSUNG freshman2017 schreibt am 09.12.2019 um 12:02:10 Uhr
LÖSUNG 09.12.2019 um 11:15 Uhr
Moin,
Die Spalten kannst du mit einem Select abfragen:
und dann die nicht vorhandenen per ALTER TABLE hinzufügen.
im 2ten Abschnitt würde ich den Import in eine Temp-Tabelle machen und die mann mittels MERGE in die persistente Tabelle einfügen.
lg,
Slainte
Die Spalten kannst du mit einem Select abfragen:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '{{Table Name}}'
AND COLUMN_NAME = '{{Column Name}}'
im 2ten Abschnitt würde ich den Import in eine Temp-Tabelle machen und die mann mittels MERGE in die persistente Tabelle einfügen.
lg,
Slainte
LÖSUNG 09.12.2019 um 12:02 Uhr
Ok, da reicht mein Wissen nicht aus, das in den Befehl einzuarbeiten. Wäre es so richtig für den ersten Teil?
Aber wie kann ich es für den zweiten Teil machen?
IF NOT EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '{{TEST}}'
AND COLUMN_NAME = '{{INT}}'
AND COLUMN_NAME = '{{Vorname}}'
AND COLUMN_NAME = '{{Nachname}}'
CREATE TABLE TEST
(
ID INT,
Vorname VARCHAR(40),
Nachname VARCHAR(40)
)
GO
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '{{TEST}}'
AND COLUMN_NAME = '{{INT}}'
AND COLUMN_NAME = '{{Vorname}}'
AND COLUMN_NAME = '{{Nachname}}'
ALTER TABLE TEST
(
ID INT,
Vorname VARCHAR(40),
Nachname VARCHAR(40),
Adresse VARCHAR(40)
)
GO
LÖSUNG 10.12.2019 um 09:06 Uhr
COLUMN_NAME kann nicht gleichzeitig 3 Werte haben, es kann also entweder INT, Vorname oder Nachname drin stehen aber nicht alles zur selben Zeit. Du wirst jede Spalte einzeln prüfen müssen und ggf. die Tabelle mit ALTER TABLE um die Spalte erweitern müssen die fehlt.
Ist das denn überhaupt sinnvoll? Ich meine meistens gibt es die Tabelle oder es gibt sie nicht. Was genau ist denn dein Ziel?
Ist das denn überhaupt sinnvoll? Ich meine meistens gibt es die Tabelle oder es gibt sie nicht. Was genau ist denn dein Ziel?
LÖSUNG 10.12.2019 um 13:00 Uhr
Zitat von ukulele-7:
COLUMN_NAME kann nicht gleichzeitig 3 Werte haben, es kann also entweder INT, Vorname oder Nachname drin stehen aber nicht alles zur selben Zeit. Du wirst jede Spalte einzeln prüfen müssen und ggf. die Tabelle mit ALTER TABLE um die Spalte erweitern müssen die fehlt.
Ist das denn überhaupt sinnvoll? Ich meine meistens gibt es die Tabelle oder es gibt sie nicht. Was genau ist denn dein Ziel?
COLUMN_NAME kann nicht gleichzeitig 3 Werte haben, es kann also entweder INT, Vorname oder Nachname drin stehen aber nicht alles zur selben Zeit. Du wirst jede Spalte einzeln prüfen müssen und ggf. die Tabelle mit ALTER TABLE um die Spalte erweitern müssen die fehlt.
Ist das denn überhaupt sinnvoll? Ich meine meistens gibt es die Tabelle oder es gibt sie nicht. Was genau ist denn dein Ziel?
Mein Ziel ist es eigentlich, dass ich gerne einen Befehl haben möchte, der prüft, ob die richtigen Spalten hinterlegt sind und ich diese einfach über eine Anweisung erweitern kann, falls gewünscht.
Des Weiteren soll er bei jedem Import aus meiner .txt Datei nicht die doppelten Datensätze einfügen sondern prüfen, ob diese bereits vorhanden oder nicht. Wenn nicht vorhanden, darf er diese einfügen.
LÖSUNG 10.12.2019 um 13:07 Uhr
Mein Ziel ist es eigentlich, dass ich gerne einen Befehl haben möchte, der prüft, ob die richtigen Spalten hinterlegt sind und ich diese einfach über eine Anweisung erweitern kann, falls gewünscht.
Dazu bauchst du für jeden Spalte ein IF EXIST mit entsprechendem SELECT nach dem Schema aus meinem Post. Bei FALSE musst du dann die Tabelle mit ALTER TABLE ... ADD <spalte> einfügenDes Weiteren soll er bei jedem Import aus meiner .txt Datei nicht die doppelten Datensätze einfügen sondern prüfen, ob diese bereits vorhanden oder nicht. Wenn nicht vorhanden, darf er diese einfügen.
Auch hier: wie bereits gepostet. BULK INSERT in temporäre Tabelle, dann mit MERGE in die persistente einfügen.LÖSUNG 10.12.2019 um 14:03 Uhr
Zitat von SlainteMhath:
Mein Ziel ist es eigentlich, dass ich gerne einen Befehl haben möchte, der prüft, ob die richtigen Spalten hinterlegt sind und ich diese einfach über eine Anweisung erweitern kann, falls gewünscht.
Dazu bauchst du für jeden Spalte ein IF EXIST mit entsprechendem SELECT nach dem Schema aus meinem Post. Bei FALSE musst du dann die Tabelle mit ALTER TABLE ... ADD <spalte> einfügenOk - ich hab es testen können:
if not exists
(
select column_name
from INFORMATION_SCHEMA.columns
where table_name = 'TEST'
and column_name = 'test'
)
ALTER TABLE BI add test TEXT
GO
Des Weiteren soll er bei jedem Import aus meiner .txt Datei nicht die doppelten Datensätze einfügen sondern prüfen, ob diese bereits vorhanden oder nicht. Wenn nicht vorhanden, darf er diese einfügen.
Auch hier: wie bereits gepostet. BULK INSERT in temporäre Tabelle, dann mit MERGE in die persistente einfügen.Ich benötige hier Unterstützung - wie kann der Befehl aussehen?
LÖSUNG 10.12.2019, aktualisiert um 14:09 Uhr
ich benötige hier Unterstützung - wie kann der Befehl aussehen?
CREATE TABLE #incoming ....
BULK INSERT #incoming ....
MERGE #incoming USING TEST ON ....
Näheres z.b. hier: http://www.sqlservertutorial.net/sql-server-basics/sql-server-merge/
DROP TABLE #incoming