繁体   English   中英

如何从 XML 到 SQL Server 表中为另一列的多个值读取(分配)tableID?

[英]How to read(assign) tableID for multiple values for one other column from XML into SQL Server table?

对不起,如果这个问题听起来很愚蠢而且我是 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

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

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);

数据库<>小提琴

或者,您可以使用此 XQuery 一次性获取表名和列名 - 无需CROSS APPLY

-- get a list of all <Field> XML elements
SELECT 
    -- grab the parent node's (<Table>) "Name" attribute as the table name
    TableName = XC.value('(../@Name)[1]', 'VARCHAR(100)'),
    -- grab the <Field> text value as column name
    ColumnName = XC.value('(.)[1]', 'VARCHAR(100)')
FROM 
    @Z_xml.nodes('/ROOT/Table/Field') AS XT(XC)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM