2010-12-27 15 views
3

Guten Tag erhöht wird,SQL Server einfügen mehr Zeilen und eine int Spalte

Ich habe ein paar Zeilen in einer Tabelle und müssen sie an einem anderen Tisch übertragen.

In der Zieltabelle muss ich auch ein Feld mit einem inkrementellen Wert hinzufügen.

Ich mache diese Art und Weise, aber ich weiß, dass etwas in dem Einsatz falsch ist, weil der erhöhte Wert (intCodInterno) ist immer das gleiche:

INSERT INTO Emp_VISOT.dbo.TBL_GCE_ARTIGOS 
     (strCodigo , 
      strDescricao , 
      intCodInterno , 
      intCodTaxaIvaCompra , 
      intCodTaxaIvaVenda , 
      strCodCategoria , 
      strAbrevMedStk , 
      strAbrevMedVnd , 
      strAbrevMedCmp , 
      bitAfectaIntrastat 
     )(
     SELECT A.Artigo , 
       a.Descricao , 
       IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1, 
       '3' , 
       '3' , 
       '1' , 
       'Un' , 
       'Un' , 
       'Un' , 
       '0' 
     FROM PRIVESAM.DBO.Artigo A) 

Was muß ich ändern, damit der Wert korrekt erhöht wird?

Vielen Dank.

EDIT:

machte ich eine kleine Änderung in der Abfrage, und jetzt funktioniert es. ich legen Sie einfach eine SELECT im IDENT_CURRENT in Klammern:

(SELECT IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1) 

ich alle Zeilen, die ich mit dem erhöhten Wert aus der alten Tabelle in die neue brauchen.

Vielen Dank für die Hilfe.

+0

Wenn Sie 'IDENT_CURRENT' verwenden, bedeutet das, dass Sie eine' IDENTITY'-Spalte in dieser Tabelle haben. Geben Sie nur diese Spalte in Ihrer Spaltenliste an und fügen Sie keine Werte ein - eine 'IDENTITY'-Spalte erhält automatisch einen neuen, eindeutigen Wert, wenn ein INSERT passiert .... –

Antwort

3

Die IDENT_CURRENT('Emp_VISOT.dbo.TBL_GCE_ARTIGOS')+1 einmal ausgewertet, wenn Sie die Abfrage ausführen möchten und alle Zeilen erhalten die gleiche ID.

erste Lösung wird über das Auswahlergebnis von einer Schleife zu durchlaufen, wie Cursor zu konstruieren oder zu löschen, und legte den inkrementierten Index (Sie tun)

zweite Lösung besteht darin, dass die Spalte in Zieltabelle zu machen identity

+0

Leider ist die Zieltabelle bereits vorhanden eine Spalte mit IDENTITY. –

+0

Suchen Sie nach einer Möglichkeit, den Wert dieser Spalte als Wert der Spalte "intCodInterno" zu verwenden, wie eine persistente berechnete Spalte oder ... –

3

Entfernen Sie das Teil mit IntCodInterno, und verwenden Sie in SQL Server das Identity property, um es automatisch für Sie zu inkrementieren.

2

IDENT_CURRENT wird nicht aktualisiert, bis die Transaktion festgeschrieben wird, daher bleibt ihr Wert bis zum Einfügen konstant.

Hier sind drei Optionen für die Festsetzung dieses Problem:

  1. eine Art Zähler verwenden (@newRowNum), so dass für jede Zeile in Ihrer SELECT-Abfrage, @newRowNum = @newRowNum +1 und damit Ihre intCodInterno Nummer = IDENT_CURRENT() + @newRowNum. Dies würde wahrscheinlich viel Hacking erfordern, um zu arbeiten. Empfehle es nicht.

  2. Fügen Sie Ihre Zeilen sequenziell mit der gleichen Geschäftslogik ein, die Sie jetzt haben - sie wird jedoch erheblich weniger leistungsfähig sein. Empfehle es nicht.

  3. Stellen Sie diese Spalte in Ihrer Zieltabelle selbst als Identitätsspalte ein. Dies ist bei weitem der beste Weg, es zu tun.

Wenn Sie eine benutzerdefinierte Identitätsfunktion benötigen (ich nehme an, es gibt einen Grund, Sie nicht eine Identitätsspalte jetzt verwenden), können Sie eine erstellen einige der Schritte oben skizzierten Verwendung: http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

0

In meinem case, i Zeilen wurden sequenziell mit der gleichen Geschäftslogik eingefügt. Ich kann das automatische Inkrement nicht verwenden, da ich auch alte Daten in diese Spalte importieren muss. Sobald Sie die Daten importiert haben, können Sie die Spalte für die automatische Erhöhung aktualisieren.