Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将另一列的多个值的tableID从XML读取(分配)到SQL Server表中?_Sql_Sql Server_Xml - Fatal编程技术网

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

如何将另一列的多个值的tableID从XML读取(分配)到SQL Server表中?,sql,sql-server,xml,Sql,Sql Server,Xml,很抱歉,如果这个问题听起来很愚蠢,而且我是XML新手 我有显示表名及其所有列名的XML元数据。在下面的示例中,我希望将所有4个列名读入4行,并将表名添加到列名的每个迭代中。但通过我的努力,我只能部分实现输出。它要么显示一个列名及其各自的表名,要么不显示表名,而是显示所有列。非常感谢您的任何建议。提前谢谢 到目前为止,我试图具体化一个表,然后使用两种方法读取值。我想检索4行2列Table@Name,Field,这里Table Name应该对所有四个不同的列名重复CD_SAP_T000 方法1: 方

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

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

到目前为止,我试图具体化一个表,然后使用两种方法读取值。我想检索4行2列Table@Name,Field,这里Table Name应该对所有四个不同的列名重复CD_SAP_T000

方法1:

方法2:


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

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一次性获取表名和列名,而无需交叉应用:


粘性位,非常感谢,您是最好的,所以交叉应用程序在您单独使用字段节点时发挥了作用。表\u名称列\u名称CD\u SAP\u T000 CCCATEGORY CD\u SAP\u T000 MANDT CD\u SAP\u T000 MTEXT CD\u SAP\u T000或01完美,谢谢marc!我有数百个XML表格,两种解决方案都有效。
rowId TableName ColumnName
--------------------------
1     NULL      CCCATEGORY
2     NULL      MANDT
3     NULL      MTEXT
4     NULL      ORT01
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
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);
-- 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)