freshman2017
Goto Top

SQL Server Express - SQL Befehl

Guten Morgen liebe Gemeinde,

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

Die .txt ist wie folgt aufgebaut:

1;Max;Mustermann
2;Erika;Musterfrau
3;Hans;Mustermann

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...

Content-Key: 523634

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

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

Member: SlainteMhath
SlainteMhath Dec 09, 2019 at 10:15:27 (UTC)
Goto Top
Moin,

Die Spalten kannst du mit einem Select abfragen:

SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = '{{Table Name}}'  
    AND COLUMN_NAME = '{{Column Name}}'  

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
Member: freshman2017
freshman2017 Dec 09, 2019 at 11:02:10 (UTC)
Goto Top
Ok, da reicht mein Wissen nicht aus, das in den Befehl einzuarbeiten. Wäre es so richtig für den ersten Teil?

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

Aber wie kann ich es für den zweiten Teil machen?
Member: ukulele-7
Solution ukulele-7 Dec 10, 2019 at 08:06:51 (UTC)
Goto Top
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?
Member: freshman2017
freshman2017 Dec 10, 2019 at 12:00:36 (UTC)
Goto Top
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?

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.
Member: SlainteMhath
SlainteMhath Dec 10, 2019 at 12:07:14 (UTC)
Goto Top
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ügen

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.
Member: freshman2017
freshman2017 Dec 10, 2019 at 13:03:50 (UTC)
Goto Top
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ügen


Ok - 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?
Member: SlainteMhath
Solution SlainteMhath Dec 10, 2019 updated at 13:09:06 (UTC)
Goto Top
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