sql - 如何从 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
解决方案
一种方法是将“字段”节点交叉应用到相应的“表”节点。
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);
推荐阅读
- css - 冻结在屏幕顶部,使剩余的填满屏幕并滚动
- c# - 将空字符串 [] 实例化为参数以使其可选
- javascript - 如何在 OOP 类中更新 Object json
- arangodb - 查询代码以查找最高值的集合?
- dart - 在画布中绘制多条线
- hadoop - Hadoop - 首次设置时遇到困难
- reporting-services - 在SSRS中的组内按日期有条件地计算行数?
- python - Tensorflow GPU 测试代码给出错误消息,但 tensorflow 可以插入
- .net - 为什么从 dot.net 调用时打开另一个工作簿的 VBA 宏不起作用
- c# - 在控制台应用程序中使用反射动态创建和调用类