Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

INSERT von Tabelle 2 in Tabelle 1

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Airbastl, 28 Juni 2013.

  1. Airbastl

    Airbastl Benutzer

    Hallo Leute habe mich jetzt mal bei euch angemeldet, weil ich seit Tagen an einem wahrscheinlich einfachen Problem sitze.

    Ich besitze eine Tabelle daten_nav und eine Tabelle CUSTOMER.
    Der Inhalt von daten_nav soll in die Tabelle CUSTOMER inserted werden.

    Jedoch habe ich in daten_nav keine Spalte ID, welche nummeriert ist.
    D.h. ich müsste diese mit Inserten (IDENTITY(1,1) kann ich leider nicht machen, da das Schema erhalten bleiben muss)

    Ich arbeite mit MSSQL 2005.


    Versucht habe ich vieles, mein letzer Versuch war:

    Code:
    DECLARE
        @KEY AS INT
     
    SET @KEY = (SELECT COUNT(CS_KEY) FROM dbo.CUSTOMER)
    SET @KEY = @KEY +1;
     
    PRINT @KEY
    INSERT INTO dbo.CUSTOMER (CS_CODE, CS_NAME, CS_KEY)
    SELECT CST_No, CST_Name, @KEY FROM dbo.daten_nav
    Mit folgendem Fehler:

    Msg 2627, Level 14, State 1, Line 10

    Violation of PRIMARY KEY constraint 'PK_CUSTOMER'. Cannot insert duplicate key in object 'dbo.CUSTOMER'.



    Vlt auch noch hilfreich, der Aufbau der Tabellen:

    Code:
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[CUSTOMER](
        [CS_KEY] [int] NOT NULL,
        [CS_CODE] [char](50) NULL,
        [CS_NAME] [char](50) NULL,
        [CS_ADDR1] [char](30) NULL,
        [CS_ADDR2] [char](30) NULL,
        [CS_ADDR3] [char](30) NULL,
        [CS_ADDR4] [char](30) NULL,
        [CS_POSTCOD] [char](20) NULL,
        [CS_PHONE] [char](20) NULL,
        [CS_FAX] [char](20) NULL,
        [CS_MODEM] [char](20) NULL,
        [CS_CONTAC1] [char](30) NULL,
        [CS_CONTAC2] [char](20) NULL,
        [CS_CONTAC3] [char](20) NULL,
        [CS_SETTNGS] [image] NULL,
    CONSTRAINT [PK_CUSTOMER] PRIMARY KEY CLUSTERED
    (
        [CS_KEY] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    Code:
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[daten_nav](
        [CST_No] [nvarchar](50) NULL,
        [CST_Name] [nvarchar](50) NULL,
        [CST_Address] [nvarchar](50) NULL,
        [CST_PostCode] [nvarchar](50) NULL,
        [CST_City] [nvarchar](50) NULL,
        [CST_Country] [nvarchar](50) NULL,
        [CST_Phone] [nvarchar](50) NULL,
        [CST_Fax] [nvarchar](50) NULL,
        [CST_Contact] [nvarchar](50) NULL,
        [CST_Sales_Consultant] [nvarchar](50) NULL,
        [CST_EMail] [nvarchar](50) NULL
    ) ON [PRIMARY]

    Sorry für den langen Post, aber ganz nach dem Motto... viel hilft viel :)

    Ich hoffe einer von euch kann mir helfen, oder mich in die richtige Richtung leiten.


    Mfg Basti
     
  2. ukulele

    ukulele Datenbank-Guru

    Prinzipiell hast du das richtig gemacht und das könnte so laufen. Ich kann mir aber vorstellen das mal Datensätze gelöscht wurden und somit die Anzahl der Datensätze nicht dem höchsten Key der enthalten ist entspricht. Probiers mal mit
    Code:
    SET @KEY = (SELECT max(CS_KEY) FROM dbo.CUSTOMER)
     
  3. Airbastl

    Airbastl Benutzer

    Danke für die schnelle Antwort. Leider genau der gleiche Fehler :(

    Momentan in dbo.CUSTOMER eine Testzeile mit CS_KEY=1
    Ein print der Variable KEY ergibt 2, das funktioniert zumindest :)
     
  4. Tommi

    Tommi Datenbank-Guru

    Hi,

    bei deinem INSERT erhälst du durch das SELECT mehr als einen Datensatz. Du versucht nun alle Datensätze mit dem gleichen @Key anzulegen, Das verstößt natürlich gegen den PRIMARY KEY.
    Versuch es mal wie folgt:

    Code:
    SELECT @KEY = MAX(CS_KEY) FROM dbo.CUSTOMER
     
    INSERT INTO dbo.CUSTOMER (CS_CODE, CS_NAME, CS_KEY)
    SELECT CST_No, CST_Name, @KEY+ROW_NUMBER() OVER (ORDER BY CST_Name) FROM dbo.daten_nav
    So sollte der Key inkementiert werden.

    Viele Grüße,
    Tommi
     
    akretschmer gefällt das.
  5. Airbastl

    Airbastl Benutzer

    Hi Tommi, danke für deine Hilfe.
    Jedoch ist die S** ziemlich hartnäckig :(

    Code:
    Msg 2601, Level 14, State 1, Line 9
    Cannot insert duplicate key row in object 'dbo.CUSTOMER' with unique index 'CS_CODE'.
    The statement has been terminated.
    Code:
    DECLARE
        @KEY AS INT
     
    SELECT @KEY = MAX(CS_KEY) FROM dbo.CUSTOMER
     
     
    INSERT INTO dbo.CUSTOMER (CS_CODE, CS_NAME, CS_KEY)
    SELECT CST_No, CST_Name, @KEY+ROW_NUMBER() OVER (ORDER BY CST_Name) FROM dbo.daten_nav
     
  6. akretschmer

    akretschmer Datenbank-Guru


    Was passiert denn wenn Du das select mal separat machst? Passen dann die Werte?
     
  7. Tommi

    Tommi Datenbank-Guru

    Hi,

    das ist aber nun noch ein anderes Problem. Anscheinend gibt es für die Spalte "CS_CODE" eine UNIQUE-Voraussetzung.
    D.h., dass du hier ebenfalls sicherstellen musst, dass diese Angabe, wie auch im Feld "CS_KEY" nur einmalig vorkommt.

    Als ersten Schritt könntest du natürlich mit einer EXISTS-Klausel die Zeilen ausfiltern, die in dbo.CUSTOMER schon mit dem Wert in der Spalte "CS_CODE" vorhanden sind.

    Viele Grüße,
    Tommi
     
  8. Tommi

    Tommi Datenbank-Guru

    Das könnte dann so aussehen:

    Code:
    INSERT ITNO dbo.CUSTOMER (CS_CODE, CS_NAME, CS_KEY)
    SELECT CST_No, CST_Name, @KEY-ROW_NUMBER() OVER (ORDER BY CST_Name) FROM dbo.daten_nav AS D
    WHERE D.CST_No NOT IN
    (SELECT CS_CODE FROM dbo.CUSTOMER GROUP BY CS_CODE)
    Natürlich solltest du dann auch den so entstehenden Gap festhalten und Analysieren! (Am Besten vor dem INSERT!)

    Viele Grüße,
    Tommi
     
  9. Airbastl

    Airbastl Benutzer

    Vielen Dank Tommi für deine Mühen, leider immer noch nix.

    Fehler: Cannot insert duplicate key row in object 'dbo.CUSTOMER' with unique index 'CS_CODE'.

    Muss ich das vlt. mit einer Schleife lösen?
     
  10. Airbastl

    Airbastl Benutzer

    Was genau meinst du mit :
    ??
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Durch
    WHERE D.CST_No NOT IN
    (SELECT CS_CODE FROM dbo.CUSTOMER GROUP BY CS_CODE)

    werden nicht alle Datensätze übernommen.
     
  12. Airbastl

    Airbastl Benutzer

    Danke euch, bin jetzt etwas weiter gekommen.
    In der Tabelle daten_nav gibt es in CST_No und CST_Name Einträge die Spaces enthalten.

    Bei CST_No kann ich dies mit LIKE = '1%' in den Griff bekommen. Bei CST_Name sieht es schon anders aus, da der Name ja nicht vorraussehbar ist.
    Hat hierzu noch einer eine Idee?
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Falsche Datentypen ;-)

    In PG gibt es trim(), um führende/nachfolgende Leerzeichen zu entfernen.
     
  14. Airbastl

    Airbastl Benutzer

    Habs mit ' %' gelöst.

    @akretschmer, du hast recht varchar ist nicht unbedingt angepasst für eine ganze zahl :D

    ich danke euch allen für eure hilfe.
     
  15. Airbastl

    Airbastl Benutzer

    Gibt es eine Möglichkeit bei einem Fehler mit dem nächsten Datensatz weiter zu arbeiten?

    z.B. ONERROR() NEXT
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden