Announcement

Collapse
No announcement yet.

index automatisch befüllen lassen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • index automatisch befüllen lassen?

    Hallo Leute,

    habe folgendes Problem:

    Ich habe eine Tabelle, bei der es eine Spalte "prod_productid" gibt welche einen eindeutigen Index hat und keine doppelten Werte zulässt.

    Ich möchte jetzt aus einer anderen Tabelle Werte einfügen, wobei die prod_productid mit einer fortlaufenden Nummer befüllt werden soll. eigentlich nichts schweres; habe ich gedacht.

    Hier mein Insert:
    INSERT INTO Products
    SELECT
    NULL, <-- diese spalte soll mit einem fortlaufenden Zähler befüllt werden
    artnr,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    benennung,
    znr
    FROM OPENQUERY(SKTFEPA,'SELECT * FROM table1 ') where artnr like 'F%';

    So erhalte ich diese Fehlermeldung:
    Meldung 2601, Ebene 14, Status 1, Zeile 1
    Eine Zeile mit doppeltem Schlüssel kann in das 'dbo.Products'-Objekt mit dem eindeutigen 'IDX_Prod_ProductId'-Index nicht eingefügt werden.

    Die ProductID soll auch nicht mit einem NULL wert befüllt werden sondern mit "1" anfangen aber ich schnall es einfach nicht.

    Danke für eure Hilfe!

  • #2
    setzt die Spalte prod_productid auf IDENTITY(1,1) NOT NULL

    Comment


    • #3
      Originally posted by bigpoint View Post
      setzt die Spalte prod_productid auf IDENTITY(1,1) NOT NULL
      mit welchem befehl? im sql express 2005 kann ich es über den objekt explorer nicht anpassen aber evtl. mit einem sql befehl? wie lautet dieser dann?

      alter table products
      alter column prod_productid int identity(1,1) not null;

      oder

      bekomme dauernd diese meldung:
      Meldung 156, Ebene 15, Status 1, Zeile 3
      Falsche Syntax in der Nähe des 'identity'-Schlüsselwortes.

      Comment


      • #4
        Hallo,

        die IDENTITY-Eigenschaft kann für eine Spalte nicht nachträglich (mit ALTER TABLE) hinzugefügt werden. Es gibt kein "ADD IDENTITY" in der Syntax von T-SQL.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Originally posted by Falk Prüfer View Post
          Hallo,

          die IDENTITY-Eigenschaft kann für eine Spalte nicht nachträglich (mit ALTER TABLE) hinzugefügt werden. Es gibt kein "ADD IDENTITY" in der Syntax von T-SQL.

          Gruß Falk
          Alles klar vielen Dank.
          Habe jetzt eine andere ID mir zusammengemurkst...ist zwar nicht die feine art aber es funktioniert auf jeden fall, da nur eindeutige werte verarbeitet werden. Es geht jetzt nur nicht von 1 los was ein bisschen schade ist.

          habe unsere artikel so manipuliert, dass ich nur noch zahlenwerte als ergebnis bekomme.

          trotzdem danke für die hilfe

          Comment


          • #6
            Originally posted by omega123 View Post
            Hallo Leute,

            habe folgendes Problem:

            Ich habe eine Tabelle, bei der es eine Spalte "prod_productid" gibt welche einen eindeutigen Index hat und keine doppelten Werte zulässt.

            Ich möchte jetzt aus einer anderen Tabelle Werte einfügen, wobei die prod_productid mit einer fortlaufenden Nummer befüllt werden soll. eigentlich nichts schweres; habe ich gedacht.

            Hier mein Insert:
            INSERT INTO Products
            SELECT
            NULL, <-- diese spalte soll mit einem fortlaufenden Zähler befüllt werden
            artnr,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            benennung,
            znr
            FROM OPENQUERY(SKTFEPA,'SELECT * FROM table1 ') where artnr like 'F%';

            So erhalte ich diese Fehlermeldung:
            Meldung 2601, Ebene 14, Status 1, Zeile 1
            Eine Zeile mit doppeltem Schlüssel kann in das 'dbo.Products'-Objekt mit dem eindeutigen 'IDX_Prod_ProductId'-Index nicht eingefügt werden.

            Die ProductID soll auch nicht mit einem NULL wert befüllt werden sondern mit "1" anfangen aber ich schnall es einfach nicht.

            Danke für eure Hilfe!
            Müßte auch mit Row_Number () gehen...
            (Im OVER-Teil die Sortierung bestimmen, nach der durchgezählt werden soll)
            Code:
            INSERT INTO Products
            SELECT 
            ROW_NUMBER () OVER (ORDER BY  ...)
            artnr,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            benennung,
            znr
            FROM OPENQUERY(SKTFEPA,'SELECT * FROM table1 ') where artnr like 'F%';

            Comment


            • #7
              Originally posted by ebis View Post
              Müßte auch mit Row_Number () gehen...
              (Im OVER-Teil die Sortierung bestimmen, nach der durchgezählt werden soll)
              Code:
              INSERT INTO Products
              SELECT 
              ROW_NUMBER () OVER (ORDER BY  ...)
              artnr,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              NULL,
              benennung,
              znr
              FROM OPENQUERY(SKTFEPA,'SELECT * FROM table1 ') where artnr like 'F%';
              also der select funktioniert auf jeden fall, der insert allerdings nicht.
              es kommt folgende fehlermeldung:

              Meldung 213, Ebene 16, Status 1, Zeile 1
              INSERT-Fehler: Spaltenname oder Anzahl der bereitgestellten Werte entspricht nicht der Tabellendefinition.

              die anzahl der spalten stimmt aber auf jeden fall überein.
              seltsam...
              Zuletzt editiert von omega123; 02.12.2009, 08:38.

              Comment


              • #8
                Originally posted by Falk Prüfer View Post
                Hallo,

                die IDENTITY-Eigenschaft kann für eine Spalte nicht nachträglich (mit ALTER TABLE) hinzugefügt werden. Es gibt kein "ADD IDENTITY" in der Syntax von T-SQL.

                Gruß Falk
                Das ist richtig, allerdings kann man eine zweite (temp) analog die erste Tabelle erstellen,
                dort die Daten kopieren, dann die IDENTITY setzen die ursprüngliche Tabelle löschen und die andere
                Tabelle in orginal Tabelle umbenennen.
                Also etwa so:
                Code:
                CREATE TABLE dbo.Tmp_Test
                	(
                	id int NOT NULL IDENTITY (1, 1),
                	test varchar(50) NULL
                	) 
                
                SET IDENTITY_INSERT dbo.Tmp_Test ON
                
                
                IF EXISTS(SELECT * FROM dbo.Test)
                	 EXEC('INSERT INTO dbo.Tmp_Test (id, tom)
                		SELECT id, test FROM dbo.Test WITH (HOLDLOCK TABLOCKX)')
                
                SET IDENTITY_INSERT dbo.Tmp_Test OFF
                
                DROP TABLE dbo.Test
                
                EXECUTE sp_rename N'dbo.Tmp_Test', N'Test', 'OBJECT' 
                
                /*
                unsprung Tabelle
                CREATE TABLE dbo.Test
                	(
                	id int NULL,
                	test varchar(50) NULL
                	)
                */

                Comment


                • #9
                  hat sich erledigt, ein komma hatte gefehlt

                  upsi

                  vielen dank leute auch dir hab mir das mal rauskopiert und im editor gespeichert, wer weiß wann ichs mal brauche

                  grüße

                  Comment


                  • #10
                    Hallo Leute,

                    ich habe nochmal bigpoints Vorschlag aufgenommen und versuche es umzusetzen. Scheitere aber an folgendem:

                    So habe ich den Abfolge bestimmt:

                    CREATE TABLE dbo.Tmp_NewProduct
                    (
                    Prod_ProductID int NOT NULL IDENTITY (1, 1),
                    Prod_CreatedBy int,
                    Prod_CreatedDate datetime,
                    Prod_UpdatedBy int,
                    Prod_UpdatedDate datetime,
                    Prod_TimeStamp datetime,
                    Prod_Deleted int,
                    prod_Active nchar(40),
                    prod_UOMCategory int,
                    prod_name nchar(50),
                    prod_code nchar(20),
                    prod_productfamilyid int,
                    prod_IntegrationId int,
                    prod_intforeignid nvarchar(255),
                    prod_intid int,
                    prod_intlastsyncdate datetime,
                    prod_promote nchar(1),
                    prod_Beschreibung nchar(30),
                    prod_benennung nchar(50),
                    prod_znr nchar(50),
                    prod_benennung2 nchar(50),
                    prod_benennung3 nchar(50),
                    prod_benennung4 nchar(50),
                    prod_benennung5 nchar(50)
                    )

                    SET IDENTITY_INSERT dbo.TMP_NewProduct ON

                    IF EXISTS(SELECT * FROM dbo.NewProduct)
                    EXEC('INSERT INTO dbo.Tmp_NewProduct
                    SELECT
                    Prod_ProductID,
                    Prod_CreatedBy,
                    Prod_CreatedDate,
                    Prod_UpdatedBy,
                    Prod_UpdatedDate,
                    Prod_TimeStamp,
                    Prod_Deleted,
                    prod_Active,
                    prod_UOMCategory,
                    prod_name,
                    prod_code,
                    prod_productfamilyid,
                    prod_IntegrationId,
                    prod_intforeignid,
                    prod_intid,
                    prod_intlastsyncdate,
                    prod_promote,
                    prod_Beschreibung,
                    prod_benennung,
                    prod_znr,
                    prod_benennung2,
                    prod_benennung3,
                    prod_benennung4,
                    prod_benennung5
                    FROM dbo.NewProduct
                    WITH (HOLDLOCK TABLOCKX)')

                    SET IDENTITY_INSERT dbo.NewProduct OFF


                    MSSQL bringt mir allerdings folgenden Fehler:

                    Msg 8101, Level 16, State 1, Line 1
                    Ein expliziter Wert für die Identitätsspalte in der 'dbo.Tmp_NewProduct'-Tabelle kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT auf ON festgelegt ist.


                    Ich kann nicht verstehen, dass diese Meldung kommt, da ich den identity_insert auf on gestellt habe. Sieht jemand den Fehler und kann mir weiterhelfen?

                    Vielen Dank für eure Mühen!

                    Gruß

                    Comment


                    • #11
                      Originally posted by omega123 View Post
                      Hallo Leute,



                      IF EXISTS(SELECT * FROM dbo.NewProduct)
                      EXEC('INSERT INTO dbo.Tmp_NewProduct
                      SELECT
                      Prod_ProductID,
                      Prod_CreatedBy,
                      Prod_CreatedDate,
                      Prod_UpdatedBy,
                      Prod_UpdatedDate,
                      Prod_TimeStamp,
                      Prod_Deleted,
                      prod_Active,
                      prod_UOMCategory,
                      prod_name,
                      prod_code,
                      prod_productfamilyid,
                      prod_IntegrationId,
                      prod_intforeignid,
                      prod_intid,
                      prod_intlastsyncdate,
                      prod_promote,
                      prod_Beschreibung,
                      prod_benennung,
                      prod_znr,
                      prod_benennung2,
                      prod_benennung3,
                      prod_benennung4,
                      prod_benennung5
                      FROM dbo.NewProduct
                      WITH (HOLDLOCK TABLOCKX)')
                      Mit Exec macht du einen eigenen Batch, für den Deine vorher gemachte Einstellung unsichtbar ist.

                      Also das SET IDENTITY_INSERT dbo.TMP_NewProduct ON in den Exec
                      bzw wozu benutzt Du das EXEC überhaupt, sollte doch auch ohne gehen...

                      Comment


                      • #12
                        Hi ebis wie sieht dann der Befehl aus?
                        Folgendermaßen bekomme ich eine Fehlermeldung aufgrund falscher Syntax in der Nähe von 'INSERT INTO dbo.Tmp_NewProduct
                        SELECT
                        Prod_ProductID,
                        Prod_CreatedBy,
                        Prod_CreatedDate,
                        Prod_UpdatedBy,
                        P'.:

                        SET IDENTITY_INSERT dbo.TMP_NewProduct ON

                        IF EXISTS(SELECT * FROM dbo.NewProduct)
                        ('INSERT INTO dbo.Tmp_NewProduct
                        SELECT
                        Prod_ProductID,
                        Prod_CreatedBy,
                        Prod_CreatedDate,
                        Prod_UpdatedBy,
                        Prod_UpdatedDate,
                        Prod_TimeStamp,
                        Prod_Deleted,
                        prod_Active,
                        prod_UOMCategory,
                        prod_name,
                        prod_code,
                        prod_productfamilyid,
                        prod_IntegrationId,
                        prod_intforeignid,
                        prod_intid,
                        prod_intlastsyncdate,
                        prod_promote,
                        prod_Beschreibung,
                        prod_benennung,
                        prod_znr,
                        prod_benennung2,
                        prod_benennung3,
                        prod_benennung4,
                        prod_benennung5
                        FROM dbo.NewProduct
                        WITH (HOLDLOCK TABLOCKX)')

                        SET IDENTITY_INSERT dbo.NewProduct OFF


                        Die Lösung ist sicherlich trivial und ich möchte mich auch entshculdigen für solche Fragen... bin ein absolutes Greenhorn...

                        danke dir!

                        Comment


                        • #13
                          Der Befehl EXEC hat Klammern und sein Inhalt, wenn denn kein Variable, muss in Hochkomma...
                          dito wenn Du den Befehl weglässt, müssen auch die Klammern und Hochkomma um das Insert weg...

                          [HIGHLIGHT="SQL"]
                          SET IDENTITY_INSERT dbo.TMP_NewProduct ON;

                          INSERT INTO dbo.Tmp_NewProduct
                          SELECT
                          Prod_ProductID,
                          Prod_CreatedBy,
                          Prod_CreatedDate,
                          Prod_UpdatedBy,
                          Prod_UpdatedDate,
                          Prod_TimeStamp,
                          Prod_Deleted,
                          prod_Active,
                          prod_UOMCategory,
                          prod_name,
                          prod_code,
                          prod_productfamilyid,
                          prod_IntegrationId,
                          prod_intforeignid,
                          prod_intid,
                          prod_intlastsyncdate,
                          prod_promote,
                          prod_Beschreibung,
                          prod_benennung,
                          p0rod_znr,
                          prod_benennung2,
                          prod_benennung3,
                          prod_benennung4,
                          prod_benennung5
                          FROM dbo.NewProduct;

                          SET IDENTITY_INSERT dbo.TMP_NewProduct OFF;
                          [/HIGHLIGHT]
                          Zuletzt editiert von ebis; 09.12.2009, 14:22.

                          Comment


                          • #14
                            Hi ebis, danke nochmal für die hilfe...

                            leider kommt immer noch folgende fehlermeldung:

                            Msg 8101, Level 16, State 1, Line 6
                            Ein expliziter Wert für die Identitätsspalte in der 'dbo.Tmp_NewProduct'-Tabelle kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT auf ON festgelegt ist.

                            Comment


                            • #15
                              Originally posted by omega123 View Post
                              Hi ebis, danke nochmal für die hilfe...

                              leider kommt immer noch folgende fehlermeldung:

                              Msg 8101, Level 16, State 1, Line 6
                              Ein expliziter Wert für die Identitätsspalte in der 'dbo.Tmp_NewProduct'-Tabelle kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT auf ON festgelegt ist.
                              dann musst Du wohl eine Spaltenliste angeben:
                              Code:
                              INSERT INTO ( <die Spalten von dbo.Tmp_NewProduct>)
                              SELECT ....

                              Comment

                              Working...
                              X