将'xml'导入到Sql Server中
我有一个像这样构造的文件:
<?xml version="1.0" encoding="UTF-8"?> <EventSchedule> <Event Uid="2" Type="Main Event"> <IsFixed>True</IsFixed> <EventKind>MainEvent</EventKind> <Fields> <Parameter Name="Type" Value="TV_Show"/> <Parameter Name="Name" Value="The Muppets"/> <Parameter Name="Duration" Value="00:30:00"/> </Fields> </Event> <Event> ...and so on </Event> </EventSchedule>
我不完全确定它是否是有效的XML,但是我需要将其导入到SQL Server中,但是我尝试的所有内容似乎都不起作用。
请任何人都可以用正确的方向指向我,或者使用一些示例代码或build议使用哪种方法?
理想情况下,我希望将原始数据放在一个平坦的表格中,如下所示:
Name | Type | Duration | EventKind The Muppets | TV_Show | 00:30:00 | MainEvent
最后,这是来自相当大的文件,我将需要定期导入。
谢谢,普古
尝试这个:
DECLARE @XML XML = '<EventSchedule> <Event Uid="2" Type="Main Event"> <IsFixed>True</IsFixed> <EventKind>MainEvent</EventKind> <Fields> <Parameter Name="Type" Value="TV_Show"/> <Parameter Name="Name" Value="The Muppets"/> <Parameter Name="Duration" Value="00:30:00"/> </Fields> </Event> <Event Uid="3" Type="Secondary Event"> <IsFixed>True</IsFixed> <EventKind>SecondaryEvent</EventKind> <Fields> <Parameter Name="Type" Value="TV_Show"/> <Parameter Name="Name" Value="The Muppets II"/> <Parameter Name="Duration" Value="00:30:00"/> </Fields> </Event> </EventSchedule>' SELECT EventUID = Events.value('@Uid', 'int'), EventType = Events.value('@Type', 'varchar(20)'), EventIsFixed =Events.value('(IsFixed)[1]', 'varchar(20)'), EventKind =Events.value('(EventKind)[1]', 'varchar(20)') FROM @XML.nodes('/EventSchedule/Event') AS XTbl(Events)
给了我一个输出:
当然,你可以轻松地做一个
INSERT INTO dbo.YourTable(EventUID, EventType, EventIsFixed, EventKind) SELECT ......
将这些数据插入到关系表中。
更新:假设你有你的XML在文件中 – 您可以使用此代码将XML文件加载到SQL Server中的XML
variables:
DECLARE @XmlFile XML SELECT @XmlFile = BulkColumn FROM OPENROWSET(BULK 'path-to-your-XML-file', SINGLE_BLOB) x;
然后使用上面的代码片断来parsingXML。
更新#2:如果您还需要参数,请使用以下XQuery语句:
SELECT EventUID = Events.value('@Uid', 'int'), EventType = Events.value('@Type', 'varchar(20)'), EventIsFixed = Events.value('(IsFixed)[1]', 'varchar(20)'), EventKind = Events.value('(EventKind)[1]', 'varchar(20)'), ParameterType = Events.value('(Fields/Parameter[@Name="Type"]/@Value)[1]', 'varchar(20)'), ParameterName = Events.value('(Fields/Parameter[@Name="Name"]/@Value)[1]', 'varchar(20)'), ParameterDuration = Events.value('(Fields/Parameter[@Name="Duration"]/@Value)[1]', 'varchar(20)') FROM @XML.nodes('/EventSchedule/Event') AS XTbl(Events)
结果是:
你可以通过创build一个目标表,然后是一个将XML元素映射到表列的模式映射文件来完成。
你可能看起来有点像这样:
create table event ( Type nvarchar(50), Name nvarchar(50), Duration nvarchar(50))
和这个:
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="Type" dt:type="string" /> <ElementType name="Name" dt:type="string" /> <ElementType name="Duration" dt:type="string" /> <ElementType name="EventSchedule" sql:is-constant="1"> <element type="Event" /> </ElementType> <ElementType name="Event" sql:relation="Event"> <element type="Type" sql:field="Type" /> <element type="Name" sql:field="Name" /> <element type="Duration" sql:field="Duration" /> </ElementType> </Schema>
然后,您可以使用XML批量加载器将XML加载到您的表中。
如果您需要在没有XMLvariables的情况下(从表值函数中的string)
SELECT --myTempTable.XmlCol.value('.', 'varchar(36)') AS val myTempTable.XmlCol.query('./ID').value('.', 'varchar(36)') AS ID ,myTempTable.XmlCol.query('./Name').value('.', 'nvarchar(MAX)') AS Name ,myTempTable.XmlCol.query('./RFC').value('.', 'nvarchar(MAX)') AS RFC ,myTempTable.XmlCol.query('./Text').value('.', 'nvarchar(MAX)') AS Text ,myTempTable.XmlCol.query('./Desc').value('.', 'nvarchar(MAX)') AS Description --,myTempTable.XmlCol.value('(Desc)[1]', 'nvarchar(MAX)') AS DescMeth2 FROM ( SELECT CAST('<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <data-set> <record> <ID>1</ID> <Name>A</Name> <RFC>RFC 1035[1]</RFC> <Text>Address record</Text> <Desc>Returns a 32-bit IPv4 address, most commonly used to map hostnames to an IP address of the host, but it is also used for DNSBLs, storing subnet masks in RFC 1101, etc.</Desc> </record> <record> <ID>2</ID> <Name>NS</Name> <RFC>RFC 1035[1]</RFC> <Text>Name server record</Text> <Desc>Delegates a DNS zone to use the given authoritative name servers</Desc> </record> </data-set> ' AS xml) AS RawXml ) AS b --CROSS APPLY b.RawXml.nodes('//record/ID') myTempTable(XmlCol); CROSS APPLY b.RawXml.nodes('//record') myTempTable(XmlCol);
或从文件:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tfu_RPT_SEL_XmlData]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) DROP FUNCTION [dbo].[tfu_RPT_SEL_XmlData] GO CREATE FUNCTION [dbo].[tfu_RPT_SEL_XmlData] ( @in_language varchar(10) ,@in_reportingDate datetime ) RETURNS TABLE AS RETURN ( SELECT --myTempTable.XmlCol.value('.', 'varchar(36)') AS val myTempTable.XmlCol.query('./ID').value('.', 'varchar(36)') AS ID ,myTempTable.XmlCol.query('./Name').value('.', 'nvarchar(MAX)') AS Name ,myTempTable.XmlCol.query('./RFC').value('.', 'nvarchar(MAX)') AS RFC ,myTempTable.XmlCol.query('./Text').value('.', 'nvarchar(MAX)') AS Text ,myTempTable.XmlCol.query('./Desc').value('.', 'nvarchar(MAX)') AS Description FROM ( SELECT CONVERT(XML, BulkColumn) AS RawXml FROM OPENROWSET(BULK 'D:\username\Desktop\MyData.xml', SINGLE_BLOB) AS MandatoryRowSetName ) AS b CROSS APPLY b.RawXml.nodes('//record') myTempTable(XmlCol) ) GO SELECT * FROM tfu_RPT_SEL_XmlData('DE', CURRENT_TIMESTAMP);
例如
DECLARE @bla varchar(MAX) SET @bla = 'BED40DFC-F468-46DD-8017-00EF2FA3E4A4,64B59FC5-3F4D-4B0E-9A48-01F3D4F220B0,A611A108-97CA-42F3-A2E1-057165339719,E72D95EA-578F-45FC-88E5-075F66FD726C' -- http://stackoverflow.com/questions/14712864/how-to-query-values-from-xml-nodes SELECT x.XmlCol.value('.', 'varchar(36)') AS val FROM ( SELECT CAST('<e>' + REPLACE(@bla, ',', '</e><e>') + '</e>' AS xml) AS RawXml ) AS b CROSS APPLY b.RawXml.nodes('e') x(XmlCol);
所以你可以有一个像
SELECT * FROM MyTable WHERE UID IN ( SELECT x.XmlCol.value('.', 'varchar(36)') AS val FROM ( SELECT CAST('<e>' + REPLACE(@bla, ',', '</e><e>') + '</e>' AS xml) AS RawXml ) AS b CROSS APPLY b.RawXml.nodes('e') x(XmlCol) )
如果你想把你的XML作为一个“纯粹的”XML字段导入,你应该创build一个像这样的表格(显然你需要很多其他字段):
CREATE TABLE [dbo].[TableXML]( [ID] [int] IDENTITY(1,1) NOT NULL, [XmlContent] [xml] NOT NULL -- specify [xml] type )
然后你可以很容易地将你的XML作为一个string插入
INSERT INTO [dbo].[TableXML] ([XmlContent]) VALUES ('<?xml version="1.0" encoding="UTF-8"?> <EventSchedule> <Event Uid="2" Type="Main Event"> <IsFixed>True</IsFixed> <EventKind>MainEvent</EventKind> <Fields> <Parameter Name="Type" Value="TV_Show"/> <Parameter Name="Name" Value="The Muppets"/> <Parameter Name="Duration" Value="00:30:00"/> </Fields> </Event> </EventSchedule>')
然后查询从MSDN t-SQL XML开始
如果您希望将其作为string存储,请使用varchar(max)来代替[XML]列types和相同的插入。 但是,如果你想轻松地查询,我build议[XML]types。 使用扁平string的方法,除非您将实现一些应用程序代码来parsing它并存储在一个平坦的表中,否则需要大量的工作。 一个好的方法可能是在一个“压缩”TABLE中的XML存储和一个用平坦字段configuration来检索数据的VIEW。