sql >> Databáze >  >> RDS >> Sqlserver

Zvyšující se pořadové číslo na SQL insertu

Nemohu testovat v roce 2005, ale měli byste být schopni použít CTE k očíslování věcí;

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;

což dává výsledek:

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

AKTUALIZACE

Pokud by dotaz někdy vložil pouze jeden FKID, fungovala by také následující zjednodušená verze (nutné změny ve vašem aktuálním dotazu jsou zvýrazněny):

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)

Účel (SELECT 1) v ROW_NUMBER ORDER BY klauzule je vyhnout se specifikaci konkrétní objednávky. Lze jej změnit na něco jiného (např. na X.value('.','VARCHAR(10)' ), v případě potřeby.



  1. aktualizovat sloupec tabulky po vložení nového záznamu pomocí spouštěčů MySQL

  2. Proč mají všechny databáze veřejné schéma v PostgreSQL?

  3. MVC3 Read-Only MySql Connection String

  4. Dělá index na Varcharu rozdíl ve výkonu?