如何解决在SQL Server中的字段ID_LIST XML中生成增量
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加载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 |
+---------+-----------+---------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。