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