【发布时间】:2021-01-22 15:03:25
【问题描述】:
如何删除#XMLItm表中的冗余?
我的代码:
BEGIN TRY
DECLARE @xml XML= '<?xml version="1.0" encoding="iso-8859-1"?>
<lists>
<list list="LIST A" remark="xx">
<item id_list="1" code="Y" description="Yes" order="1" enabled="1" />
<item id_list="1" code="N" description="No" order="2" enabled="1" />
</list>
<list list="LIST B" remark="yy">
<item id_list="2" code="E" description="Enabled" order="1" enabled="1" />
<item 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
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 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,
NAME_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,
NAME_LIST,
REMARKS)
VALUES
(
CTE_DATA_ORIGIN.ID_LIST,
CTE_DATA_ORIGIN.NAME_LIST,
CTE_DATA_ORIGIN.REMARKS
);
CREATE TABLE #XMLItm
(
[ID_OPTION_LIST] INT NOT NULL,
[ID_LIST] INT NOT NULL,
[CODE] VARCHAR(50) NOT NULL,
[DESCRIPTION] VARCHAR(1000) NOT NULL,
[ORDER] INT NOT NULL,
[ENABLED] BIT
);
INSERT INTO #XMLItm
(
ID_OPTION_LIST,
ID_LIST,
CODE,
DESCRIPTION,
ORDER,
ENABLED
)
SELECT DISTINCT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID_OPTION_LIST,
-- I want delete this option and load the ID_LIST from #XMLLst
Ssn.value('(/item/@id_list)[1]', 'int') AS ID_LIST,
Ssn.value('(/item/@code)[1]', 'varchar(50)') AS CODE,
Ssn.value('(/item/@description)[1]', 'varchar(1000)') AS DESCRIPTION,
Ssn.value('(/item/@order)[1]', 'int') AS ORDER,
Ssn.value('(/item/@enabled)[1]', 'int') AS ENABLED
FROM
(
SELECT S.s.query('.') AS Ssn
FROM @xml.nodes('/lists/list/item') AS S(s)
) AS SSnes;
WITH CTE_DATA_ORIGIN
AS (SELECT DISTINCT
ID_OPCION_LIST,
ID_LIST,
CODE,
DESCRIPTION,
ORDER,
ENABLED
FROM #XMLItm)
MERGE INTO [sos].[ITEM_LIST] ITEM
USING CTE_DATA_ORIGIN
ON ITEM.ID_OPTION_LIST = CTE_DATA_ORIGIN.ID_OPTION_LIST
AND ITEM.ID_LIST = CTE_DATA_ORIGIN.ID_LIST
WHEN MATCHED AND CTE_DATA_ORIGIN.CODE = ITEM.CODE
THEN UPDATE SET
ITEM.DESCRIPTION = CTE_DATA_ORIGIN.DESCRIPTION,
ITEM.ORDER = CTE_DATA_ORIGIN.ORDER,
ITEM.ENABLED = CTE_DATA_ORIGIN.ENABLED
WHEN NOT MATCHED
THEN
INSERT(ID_OPTION_LIST,
ID_LIST,
CODE,
DESCRIPTION,
ORDER,
ENABLED)
VALUES
(
CTE_DATOS_ORIGEN.ID_OPTION_LIST,
CTE_DATOS_ORIGEN.ID_LIST,
CTE_DATOS_ORIGEN.CODE,
CTE_DATOS_ORIGEN.DESCRIPTION,
CTE_DATOS_ORIGEN.ORDER,
CTE_DATOS_ORIGEN.ENABLED
);
DROP TABLE #XMLLst;
DROP TABLE #XMLItm;
在这段代码中,我想在两个表中为一个公共字段 ID_LIST 加载信息。如何从临时表#XMLItm 中的#XMLLst 加载ID_LIST?
我想从表#XMLItm 中的XML 中删除字段ID_LIST,并从临时表#XMLLst 中获取ID_LIST;
功能:
在#XMLLst 表中加载一个包含您的 ID(自动递增)、名称和备注的列表,然后从 XML 导出到 SQL。
在表#XMLItm 中加载与id 列表链接的项目。
预期输出
+-----------+---------------+---------+
|ID_LIST | NAME_LIST | REMARKS |
|1 |LIST A | xx |
|2 |LIST B | yy |
+-------------------------------------+
ID_OPTION_LIST ID_LIST CODE DESCRIPTION ORDER ENABLED
1 1 Y yes 1 1
2 1 N No 2 1
3 2 E Enabled 1 1
4 2 D Disables 2 1
【问题讨论】:
-
我真的不明白这篇文章的目的。 "...我想删除表中 ID_LIST 字段的冗余部分 #XMLItm..." ?!请编辑您的帖子并说明清楚。
-
Willmar,请通过 LinkedIn 或 Skype 与我联系。
标签: sql sql-server xml sql-server-2017 sql-server-2019