Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql 从XML类型列解析或获取表_Sql_Sql Server_Xml_Parsing_Xml Parsing - Fatal编程技术网

Sql 从XML类型列解析或获取表

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

我有一列XML数据,其中包含数千条记录/单元格。此列中的每个单元格都采用这种形式(下面是一个单元格的外观-假设它是单元格3):

公司表

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没关系,你可以稍后再来。现在,您可以接受答案(复选标记)。投票和接受是两种不同的行为。快乐编码