Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zwiększanie numeru sekwencyjnego we wstawce SQL

Nie mogę testować w 2005 r., ale powinieneś być w stanie użyć CTE do numerowania rzeczy;

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 daje wynik:

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

AKTUALIZUJ

Jeśli zapytanie kiedykolwiek wstawi tylko jeden FKID, poniższa uproszczona wersja również będzie działać (niezbędne zmiany w bieżącym zapytaniu są podświetlone):

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)

Cel (SELECT 1) w ROW_NUMBER ORDER BY klauzulą ​​jest unikanie określania konkretnego zamówienia. Można go zmienić na coś innego (np. na X.value('.','VARCHAR(10)' ), jeśli to konieczne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można przekazać parametrów wejściowych do procedury składowanej

  2. Alias ​​między bazami danych SQL Server

  3. Utwórz tabelę tymczasową na podstawie innej tabeli w SQL Server

  4. Średnia zgrupowanych wierszy w Sql Server

  5. Kompozytowy klucz podstawowy JPA