sql >> Database >  >> RDS >> Sqlserver

Oplopend volgnummer op SQL-invoeging

Ik kan niet testen op 2005, maar je zou een CTE prima moeten kunnen gebruiken om dingen te nummeren;

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;

wat het resultaat geeft:

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

UPDATE

Als de zoekopdracht ooit slechts één FKID zal invoegen, zou de volgende vereenvoudigde versie ook werken (de noodzakelijke wijzigingen aan uw huidige zoekopdracht zijn gemarkeerd):

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)

Het doel van (SELECT 1) in de ROW_NUMBER 's ORDER BY clausule is om het specificeren van een bepaalde volgorde te vermijden. Het kan worden gewijzigd in iets anders (bijv. in X.value('.','VARCHAR(10)' ), indien nodig.



  1. Gegevens uit één tabel draaien met SQL Server 2005

  2. PostgreSQL-query is traag bij gebruik van NOT IN

  3. Wat betekent max_connections echt?

  4. kan handelsmerksymbool niet weergeven in mysql naar html