Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Увеличаване на пореден номер при вмъкване на SQL

Не мога да тествам на 2005, но трябва да можете да използвате CTE съвсем добре, за да номерирате нещата;

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;

което дава резултата:

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

АКТУАЛИЗАЦИЯ

Ако заявката някога ще вмъкне само един FKID, следната опростена версия също ще работи (необходимите промени в текущата ви заявка са подчертани):

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)

Целта на (SELECT 1) в ROW_NUMBER ORDER BY на клауза е да се избягва уточняването на конкретен ред. Може да се промени на нещо друго (напр. на X.value('.','VARCHAR(10)' ), ако е необходимо.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server BCP експортира повреден файл?

  2. Как да намерите съпоставянето в SQL Server (T-SQL)

  3. Вземете N последни реда от таблицата с една съхранена процедура

  4. SQL Server 2008:преместване на данни между среди

  5. Масив за съхранение в SQL Server 2008