INSERT von Tabelle 2 in Tabelle 1

Airbastl

Benutzer
Beiträge
19
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
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
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)
 

Airbastl

Benutzer
Beiträge
19
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 :)
 

Tommi

Datenbank-Guru
Beiträge
290
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
 

Airbastl

Benutzer
Beiträge
19
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
 

akretschmer

Datenbank-Guru
Beiträge
9.846
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


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

Tommi

Datenbank-Guru
Beiträge
290
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
 

Tommi

Datenbank-Guru
Beiträge
290
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
 

Airbastl

Benutzer
Beiträge
19
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?
 

Airbastl

Benutzer
Beiträge
19
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.846
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?

Falsche Datentypen ;-)

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

Airbastl

Benutzer
Beiträge
19
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.
 
Werbung:
Oben