在SQL Server中的字段ID_LIST XML中生成增量

问题描述

在此示例中,如何为id_list字段生成自动增量:

BEGIN TRY
    DECLARE @xml XML= '<?xml version="1.0" encoding="iso-8859-1"?>
                <lists>
                    -- I need delete id and generate auto the autoincrement
                    <list id="1" list="LIST A" remark="xx">
                        <item id_option="1" id_list="1" code="Y" description="Yes" order="1" enabled="1" />
                        <item id_option="2" id_list="1" code="N" description="No" order="2" enabled="1" />
                    </list>
                    <list id="2" list="LIST B" remark="yy">
                        <item id_option="3" id_list="2" code="E" description="Enabled" order="1" enabled="1" />
                        <item id_option="4" id_list="2" code="D" description="disabled" order="2" active="1" />
                    </list>
                </lists>';
    CREATE TABLE #XMLLst
    (
        [ID_LIST]      INT NOT NULL,[NAME_LIST]  VARCHAR(250) NOT NULL,[REMARKS] VARCHAR(8000)
    );
    INSERT INTO #XMLLst
    (
        ID_LIST,NAME_LIST,REMARKS
    )
           SELECT disTINCT 
                  Ssn.value('(/list/@id)[1]','int') AS ID_LIST,Ssn.value('(/list/@list)[1]','Varchar(250)') AS NAME_LIST,Ssn.value('(/list/@remark)[1]','varchar(8000)') AS REMARKS
           FROM
           (
               SELECT S.s.query('.') AS Ssn
               FROM @xml.nodes('/lists/list') AS S(s)
           ) AS SSnes;
    WITH CTE_DATOS_ORIGEN
         AS (SELECT disTINCT 
                    ID_LIST,REMARKS
             FROM #XMLLst)
         MERGE INTO [sos].[LIST] LIST
         USING CTE_DATA_ORIGIN
         ON LIST.ID_LIST = CTE_DATA_ORIGIN.ID_LIST
             WHEN MATCHED AND CTE_DATA_ORIGIN.NAME_LIST = LIST.NAME_LIST
             THEN UPDATE SET 
                             LIST.NAME_LIST = CTE_DATA_ORIGIN.NAME_LIST,LIST.REMARKS = CTE_DATA_ORIGIN.REMARKS
             WHEN NOT MATCHED
             THEN
               INSERT(ID_LIST,REMARKS)
               VALUES
         (
            CTE_DATA_ORIGIN.ID_LIST,CTE_DATA_ORIGIN.NAME_LIST,CTE_DATA_ORIGIN.REMARKS
         );
    DROP TABLE #XMLLst;

我需要从xml中删除字段ID并自动生成ID。

该xml加载2个具有ID,名称和备注的元素,该表无法修改,并且ID_table字段没有自动递增。

解决方法

这里是如何从XML生成自动增量ID列。

我修改了 @id 属性值,如下所示:10和20。

ROW_NUMBER()窗口函数会生成您想要的内容。

我没有处理MERGE语句。由你决定。

SQL

-- DDL and sample data population,start
DECLARE @xml XML= 
'<?xml version="1.0" encoding="iso-8859-1"?>
<lists>-- I need delete id and generate auto the autoincrement
    <list id="10" list="LIST A" remark="xx">
        <item id_option="1" id_list="1" code="Y" description="Yes" order="1"
              enabled="1"/>
        <item id_option="2" id_list="1" code="N" description="No" order="2"
              enabled="1"/>
    </list>
    <list id="20" list="LIST B" remark="yy">
        <item id_option="3" id_list="2" code="E" description="Enabled" order="1"
              enabled="1"/>
        <item id_option="4" id_list="2" code="D" description="Disabled"
              order="2" active="1"/>
    </list>
</lists>';

DECLARE @XMLLst TABLE ([ID_LIST] INT NOT NULL,[NAME_LIST]  VARCHAR(250) NOT NULL,[REMARKS] VARCHAR(8000));
-- DDL and sample data population,end

INSERT INTO @XMLLst (ID_LIST,NAME_LIST,REMARKS)
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID_LIST
    --,c.value('@id','INT') AS ID,c.value('@list','VARCHAR(250)') AS NAME_LIST,c.value('@remark','VARCHAR(8000)') AS REMARKS
FROM @xml.nodes('/lists/list') AS t(c);

-- test
SELECT * FROM @XMLLst;

输出

+---------+-----------+---------+
| ID_LIST | NAME_LIST | REMARKS |
+---------+-----------+---------+
|       1 | LIST A    | xx      |
|       2 | LIST B    | yy      |
+---------+-----------+---------+