# 2 Tabellen vergleichen u. Daten die nicht in beiden sind, löschen!



## L17 (14. Juli 2008)

Hallo Community,

Wie ich in meiner Überschrift schon schreibe, ich habe 2 Tabellen in einer SQL Datenbank liegen, beide beinhalten neben zahlreichen Daten auch den Datensatz "Artikelnummer".
Jetzt möchte ich diese 2 Tabellen in eine fassen (Was mir mit "zusammenführen" auch gelungen ist, jedoch stehen die leeren Datensätze immernoch drinne).

In einer der 2 Tabellen fehlt jedoch des öfteren der Wert für "Artikelnummer", fehlt dieser soll der Datensatz gelöscht werden. Nurl, wie mach ich das am geschicktesten?

Über Ideen und Ratschläge würde ich mich freuen!


----------



## Zvoni (14. Juli 2008)

L17 hat gesagt.:


> Hallo Community,
> 
> Wie ich in meiner Überschrift schon schreibe, ich habe 2 Tabellen in einer SQL Datenbank liegen, beide beinhalten neben zahlreichen Daten auch den Datensatz "Artikelnummer".
> Jetzt möchte ich diese 2 Tabellen in eine fassen (Was mir mit "zusammenführen" auch gelungen ist, jedoch stehen die leeren Datensätze immernoch drinne).
> ...



DELETE * FROM myTable WHERE Artikelnummer=""


----------



## L17 (15. Juli 2008)

Aufgabe:

Eine Liste mit Artikeln; die ohne Anr sollen raus.
Alles in EINE Tabelle der Datenbank Quasar3.

Quelle:  - Einzelstatistik u. Stammdaten der Artikel
            - (Tabellen dbo.es u. dbo.ar der Datenbank Quasar3)
            - in der Einzelstatistik stehen leere Datensätze
            - diese gilt es zu löschen
            - Einzelstatistik und Stammdaten müssen nun in EINE Tabelle gefasst werden

Ziel:      - Alle Daten in EINE neue Tabelle der Datenbank schreiben. 
            -(Tabelle dbo.ES_NEU der Datenbank Quasar3)

Hinweise:

 - Die Datenbank befindet sich auf einem SQL-Server
 - gearbeitet habe ich mit dem Integration Service unter dem SSBIDS
 - Wie und wo, baue ich den Befehl "DELETE * FROM dbo.es WHERE es_arnr=" ein?

Problem:

 - Die leeren Datensätze der Tabelle dbo.es (speziell es_arnr) löschen
 - Daten werden nicht in die Tabelle geschrieben (Es wird jedoch kein Fehler angezeigt)


----------



## Zvoni (15. Juli 2008)

L17 hat gesagt.:


> Aufgabe:
> 
> - Wie und wo, baue ich den Befehl "DELETE * FROM dbo.es WHERE es_arnr=" ein?



Das ist ANSI-SQL und jede DB-Anwendung hat irgendwo eine Funktion, wo man direkt einen SQL-Befehl eingeben kann.

Je nach SQL-Dialekt kann es auch "... WHERE IsNull(es_anr)" heissen oder ähnlich, musst du selbst rausfinden.

Um Daten aus zwei Tabellen in eine zusammenzufügen ist das SQL-Schlüsselwort "UNION" dein Freund.

Um Daten aus einer Tabelle in eine andere zu kopieren ist das SQL-Schlüsselwort "INTO" dein Freund, allerdings weiss ich es gerade nicht aus dem Kopf ob es "SELECT * INTO myNewTable FROM myOldTable" heisst oder "SELECT * FROM myOldTable INTO myNewTable". --> ausprobieren.


----------



## L17 (15. Juli 2008)

Vielen Dank an dieser Stelle erstmal, ich werde Deine Tipps gut gebrauchen können.


----------



## L17 (16. Juli 2008)

Hallo,

zurzeit funktioniert alles, bis auf das Löschen -.-

Er führt die 2 Tabellen richtig zusammen, schreibt sie auch in eine neue etc.

beim Löschen bringt er mir jedoch noch diesen Fehler:

"Ein OLE DB-Datensatz ist verfügbar. Quelle: 'Microsoft SQL Native Client' HRESULT: 0x80040E14 Beschreibung: 'Die gespeicherte Prozedur 'DELETE * FROM dbo.es WHERE es_arnr=' wurde nicht gefunden.'.
Fehler: 0xC0202009 bei Datenflusstask, Befehl zum Zeilenlöschen 1 [1]: OLE DB-Fehler. Fehlercode: 0x80040E14."

Er findet die Prozedur nicht, wie behebe ich diesen Fehler?

mfg und Danke.


----------



## Zvoni (16. Juli 2008)

Diverse DB-Systeme unterstützen sogenannte "gespeicherte Prozeduren", was nix anderes ist als SQL-Anweisungen, denen ein Name gegeben wurde und permanent in der DB gespeichert sind.

Wahrscheinlich gibt es in deinem DB-System irgendwo die Option "Erstelle neue gespeicherte Prozedur" oder etwas in der Art. Das aufrufen, einen Namen vergeben (Bsp. "LöscheLeereSätze"), und die DELETE-Anweisung eintragen.

Die gespeicherte Prozedur "LöscheLeereSätze" rufst du dann im Prinzip wie jede andere DB-Tabelle auf

DB.OpenRecordset("LöscheLeereSätze") oder ähnlich



L17 hat gesagt.:


> Hallo,
> 
> zurzeit funktioniert alles, bis auf das Löschen -.-
> 
> ...


----------



## L17 (16. Juli 2008)

okay, nach einigem Suchen haben ich rausgefunden, wie man so eine Prozedur erstellt / speichert, man bekommt eine Vorlage:

-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
	-- Add the parameters for the stored procedure here
	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO



In dieser ist nun der Befehl zu definieren, aber da scheitere ich dran, solche Künste in Sachen Programmierung unter VB habe ich leider noch nicht. 

"DELETE * FROM dbo.ES_neU WHERE es_arnr=" ist nun !!NICHT!! mehr der Befehl, da dieser leider garnicht funktionierte..da bräuchte ich also auch einen neuen -.- leider

 .wäre wirklich nett, wenn ihr mir an dieser Stelle nochmal helfen könntet


----------

