Sql 从XML类型列解析或获取表
我有一列XML数据,其中包含数千条记录/单元格。此列中的每个单元格都采用这种形式(下面是一个单元格的外观-假设它是单元格3): 公司表Sql 从XML类型列解析或获取表,sql,sql-server,xml,parsing,xml-parsing,Sql,Sql Server,Xml,Parsing,Xml Parsing,我有一列XML数据,其中包含数千条记录/单元格。此列中的每个单元格都采用这种形式(下面是一个单元格的外观-假设它是单元格3): 公司表 Cell No | Party Name | Role | Contact_Required Cell 3 | A2 Milk | Client | Yes Cell 3 | Citi Bank | Client | Yes Cell 3 | McKinse
Cell No | Party Name | Role | Contact_Required
Cell 3 | A2 Milk | Client | Yes
Cell 3 | Citi Bank | Client | Yes
Cell 3 | McKinsey Co | Provider | No
Cell 4 | .... | .... | ...
Cell 4 | .... | .... | ...
Cell 5 | .... | .... | ...
每个单元的成员和公司数量可能不同。请你帮我拿一下好吗?恐怕盒子里什么都没有 T-SQL可能是用于此的错误工具 动态创建SQL需要变量表和列名。但您可以尝试以下方法: 创建一个模型场景 --这将插入
CREATE TABLE
语句
INSERT INTO @commands
SELECT CONCAT(N'CREATE TABLE dbo.',QUOTENAME(A.t.value('@Name','nvarchar(1000)')),N'('
,STUFF((SELECT CONCAT(',',QUOTENAME(B.f.value('text()[1]','nvarchar(1000)')),N' NVARCHAR(',B.f.value('@Width','int'),')' )
FROM A.t.nodes('Headers/Field') B(f)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,N');')
FROM @mokupTable t
CROSS APPLY t.YourXmlColumn.nodes('/Document/Table') A(t)
--这将生成INSERT
语句
INSERT INTO @commands
SELECT CONCAT(N'INSERT INTO dbo.',QUOTENAME(A.t.value('@Name','nvarchar(1000)')),N'('
,STUFF((SELECT CONCAT(',',QUOTENAME(B.f.value('text()[1]','nvarchar(1000)')))
FROM A.t.nodes('Headers/Field') B(f)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,N') VALUES '
,STUFF((SELECT CONCAT(N',('
,STUFF((SELECT CONCAT(',''',QUOTENAME(C.f.value('text()[1]','nvarchar(1000)')),N'''' )
FROM B.r.nodes('Field') C(f)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,')')
FROM A.t.nodes('Row') B(r)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,N';')
FROM @mokupTable t
CROSS APPLY t.YourXmlColumn.nodes('/Document/Table') A(t)
--使用光标
运行命令并打印出来进行测试
DECLARE @cmd NVARCHAR(MAX);
DECLARE cur CURSOR FOR SELECT cmd FROM @commands ORDER BY ID;
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS=0
BEGIN
--Use EXEC(@cmd); to execute the statement
PRINT @cmd;
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
代码将创建和打印如下语句
CREATE TABLE dbo.[Team Members]([Name] NVARCHAR(30),[Country] NVARCHAR(18),[Department] NVARCHAR(25),[Role] NVARCHAR(25));
CREATE TABLE dbo.[Companies]([Party Name] NVARCHAR(50),[Role] NVARCHAR(25),[Contact Required?] NVARCHAR(23));
INSERT INTO dbo.[Team Members]([Name],[Country],[Department],[Role]) VALUES ('[Lincoln]','[Australia]','[Sales]','[Manager]'),('[Andrew]','[Vietnam]','[Estate]','[Director]');
INSERT INTO dbo.[Companies]([Party Name],[Role],[Contact Required?]) VALUES ('[A2 Milk]','[Client]','[Yes]'),('[Citi Bank]','[Client]','[No]'),('[McKinsey Co]','[Provider]','[No]');
只需使用
EXEC(@cmd)代码>以执行此操作。使用测试数据库并尝试一下:-)恐怕没有现成的东西
T-SQL可能是用于此的错误工具
动态创建SQL需要变量表和列名。但您可以尝试以下方法:
创建一个模型场景
--这将插入CREATE TABLE
语句
INSERT INTO @commands
SELECT CONCAT(N'CREATE TABLE dbo.',QUOTENAME(A.t.value('@Name','nvarchar(1000)')),N'('
,STUFF((SELECT CONCAT(',',QUOTENAME(B.f.value('text()[1]','nvarchar(1000)')),N' NVARCHAR(',B.f.value('@Width','int'),')' )
FROM A.t.nodes('Headers/Field') B(f)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,N');')
FROM @mokupTable t
CROSS APPLY t.YourXmlColumn.nodes('/Document/Table') A(t)
--这将生成INSERT
语句
INSERT INTO @commands
SELECT CONCAT(N'INSERT INTO dbo.',QUOTENAME(A.t.value('@Name','nvarchar(1000)')),N'('
,STUFF((SELECT CONCAT(',',QUOTENAME(B.f.value('text()[1]','nvarchar(1000)')))
FROM A.t.nodes('Headers/Field') B(f)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,N') VALUES '
,STUFF((SELECT CONCAT(N',('
,STUFF((SELECT CONCAT(',''',QUOTENAME(C.f.value('text()[1]','nvarchar(1000)')),N'''' )
FROM B.r.nodes('Field') C(f)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,')')
FROM A.t.nodes('Row') B(r)
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,1,'')
,N';')
FROM @mokupTable t
CROSS APPLY t.YourXmlColumn.nodes('/Document/Table') A(t)
--使用光标
运行命令并打印出来进行测试
DECLARE @cmd NVARCHAR(MAX);
DECLARE cur CURSOR FOR SELECT cmd FROM @commands ORDER BY ID;
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS=0
BEGIN
--Use EXEC(@cmd); to execute the statement
PRINT @cmd;
FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
代码将创建和打印如下语句
CREATE TABLE dbo.[Team Members]([Name] NVARCHAR(30),[Country] NVARCHAR(18),[Department] NVARCHAR(25),[Role] NVARCHAR(25));
CREATE TABLE dbo.[Companies]([Party Name] NVARCHAR(50),[Role] NVARCHAR(25),[Contact Required?] NVARCHAR(23));
INSERT INTO dbo.[Team Members]([Name],[Country],[Department],[Role]) VALUES ('[Lincoln]','[Australia]','[Sales]','[Manager]'),('[Andrew]','[Vietnam]','[Estate]','[Director]');
INSERT INTO dbo.[Companies]([Party Name],[Role],[Contact Required?]) VALUES ('[A2 Milk]','[Client]','[Yes]'),('[Citi Bank]','[Client]','[No]'),('[McKinsey Co]','[Provider]','[No]');
只需使用EXEC(@cmd)代码>以执行此操作。使用测试数据库并尝试一下:-)您可能从现有问题获得了一个良好的起点:您可能从现有问题获得了一个良好的起点:@WillV Hi,刚刚看到一个错误。。。请删除insert语句填充值的QUOTENAME()。。。目前通过电话发帖…我想更新你的评论,但无法更新,因为我有一个新的profile@WillV没关系,你可以稍后再来。现在,您可以接受答案(复选标记)。投票和接受是两种不同的行为。高兴的Coding@WillV嗨,刚刚看到一个错误。。。请删除insert语句填充值的QUOTENAME()。。。目前通过电话发帖…我想更新你的评论,但无法更新,因为我有一个新的profile@WillV没关系,你可以稍后再来。现在,您可以接受答案(复选标记)。投票和接受是两种不同的行为。快乐编码