簡體   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