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 を 1 つだけ挿入する場合は、次の簡略化されたバージョンも機能します (現在のクエリに必要な変更が強調表示されています)。

    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. mysqlストアドプロシージャエラー(1172、「結果は複数の行で構成されていました」)

    2. PHPを使用してMySQLデータベーステーブルの最後のレコードをフェッチするにはどうすればよいですか?

    3. MySQLユーザー定義変数のストレージ制限

    4. PostgreSQLにSSISのような機能はありますか?