sql >> Database teknologi >  >> RDS >> Sqlserver

Inkrementerende sekvensnummer på SQL-indsæt

Jeg kan ikke teste på 2005, men du burde være i stand til at bruge en CTE fint til at nummerere ting;

DECLARE @FKID INT
SET @FKID = 1
DECLARE @NEWDATA XML
SET @NEWDATA = '<data><text>three</text><text>four</text><text>five</text></data>'

;WITH cte AS (SELECT @FKID FKID, X.value('.','VARCHAR(10)') a, 
                  ROW_NUMBER() OVER (ORDER BY X) r
             FROM @NEWDATA.nodes('/data/text') AS X(X))
INSERT INTO TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])
SELECT fkid, a,
  (SELECT ISNULL(MAX([SEQUENCE]),0)+r FROM TEMPTABLE WHERE [FKID]=cte.fkid)
FROM cte;

SELECT * FROM TEMPTABLE;

hvilket giver resultatet:

1    1    one     1
2    1    two     2
3    1    three   3
4    1    four    4
5    1    five    5

OPDATERING

Hvis forespørgslen nogensinde kun vil indsætte ét FKID, ville den følgende forenklede version også fungere (de nødvendige ændringer af din nuværende forespørgsel er fremhævet):

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])
SELECT @FKID, 
       X.value('.','VARCHAR(10)'),
       (SELECT ISNULL(MAX([SEQUENCE]),0)+1 FROM #TEMPTABLE WHERE [FKID][email protected])
        + ROW_NUMBER() OVER (ORDER BY (SELECT 1))
FROM @NEWDATA.nodes('/data/text') AS X(X)

Formålet med (SELECT 1) i ROW_NUMBER 's ORDER BY klausul er at undgå at specificere en bestemt rækkefølge. Det kan ændres til noget andet (f.eks. til X.value('.','VARCHAR(10)' ), hvis det er nødvendigt.



  1. Grupperækker Holder rækkefølgen af ​​værdier

  2. SELECT AS-kolonnen findes ikke i WHERE-udtrykket

  3. Advarsel:mysql_fetch_object():det leverede argument er ikke en gyldig MySQL-resultatressource

  4. Sprogoversættelse til tabeller