首页 > 解决方案 > 如何从 XML 读取(分配)另一列的多个值的 tableID 到 SQL Server 表中?

问题描述

对不起,如果这个问题听起来很愚蠢而且我是 XML 新手。

我有显示表名称及其所有列名的 XML 元数据。在下面的示例中,我想将所有 4 个列名读入 4 行,并将表名添加到列名的每次迭代中。但是通过我的尝试,我只能部分实现输出。它要么显示一个列名及其各自的表名,要么不显示表名但显示所有列。非常感谢任何建议。提前致谢!

到目前为止,我已经尝试具体化一个表,然后使用两种方法读取值。我想检索 4 行和 2 列(表 @Name,字段),这里表名应该为所有四个不同的列名重复“CD_SAP_T000”。

方法#1

DECLARE @xml XML = '<ROOT>
  <Table Name="CD_SAP_T000">
    <Field>CCCATEGORY</Field>
    <Field>MANDT</Field>
    <Field>MTEXT</Field>
    <Field>ORT01</Field>
  </Table>
</ROOT>'

SELECT
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) rowId,
    x.Y.value('@Name[1]', 'VARCHAR(100)') AS TableName,
    x.y.value('.', 'NVARCHAR(200)' ) AS ColumnName
FROM 
    @xml.nodes('//*[text()]') AS x(y)

方法 #1 的结果:

rowId TableName ColumnName
--------------------------
1     NULL      CCCATEGORY
2     NULL      MANDT
3     NULL      MTEXT
4     NULL      ORT01

方法#2

IF OBJECT_ID('dbo.myTable') IS NOT NULL 
     DROP TABLE dbo.myTable

CREATE TABLE [dbo].[myTable]
(
    [Name] VARCHAR(100) NULL,
    [Field] VARCHAR(100) NULL
);

DECLARE @Z_xml XML

SET @Z_xml = '<ROOT>
  <Table Name="CD_SAP_T000">
    <Field>CCCATEGORY</Field>
    <Field>MANDT</Field>
    <Field>MTEXT</Field>
    <Field>ORT01</Field>
  </Table>
</ROOT>'

INSERT INTO myTable (Name, Field)
    SELECT
        x.mytable.value('@Name[1]', 'VARCHAR(100)'),
        x.mytable.value('Field[1]', 'VARCHAR(100)')
    FROM
        @Z_xml.nodes('//ROOT/Table') AS x ( mytable )

 SELECT * FROM mytable

方法 #2 的结果:

Name        Field
--------------------------
CD_SAP_T000 CCCATEGORY

标签: sqlsql-serverxml

解决方案


一种方法是将“字段”节点交叉应用到相应的“表”节点。

SELECT t.node.value('(@Name)[1]', 'varchar(MAX)') table_name,
       c.node.value('(text())[1]', 'varchar(MAX)') column_name
       FROM @Z_xml.nodes('/ROOT/Table') t(node)
            CROSS APPLY t.node.nodes('./Field') c(node);

db<>小提琴


推荐阅读