Importar ‘xml’ en el servidor Sql

Tengo un archivo que está estructurado así:

   True MainEvent        ...and so on   

No estoy del todo seguro de si es XML válido, sin embargo, tengo que importarlo a SQL Server, pero todo lo que bash no parece funcionar.

¿Podría alguien señalarme en la dirección correcta con algún código de ejemplo o una recomendación sobre qué método usar?

Idealmente quisiera obtener los datos sin procesar en una tabla plana, a lo largo de las líneas de:

 Name | Type | Duration | EventKind The Muppets | TV_Show | 00:30:00 | MainEvent 

Finalmente, esto proviene de archivos bastante grandes y tendré que importarlos regularmente.

Gracias, pugu

Prueba esto:

 DECLARE @XML XML = '  True MainEvent        True SecondaryEvent       ' 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) 

Me da una salida de:

enter image description here

Y por supuesto, puedes hacer un

 INSERT INTO dbo.YourTable(EventUID, EventType, EventIsFixed, EventKind) SELECT ...... 

para insertar esos datos en una tabla relacional.

Actualización: suponiendo que tiene su XML en archivos: puede usar este código para cargar el archivo XML en una variable XML en SQL Server:

 DECLARE @XmlFile XML SELECT @XmlFile = BulkColumn FROM OPENROWSET(BULK 'path-to-your-XML-file', SINGLE_BLOB) x; 

y luego use el fragmento de código anterior para analizar el XML.

Actualización # 2: si también necesita los parámetros, use esta statement 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) 

Resultados en:

enter image description here

Lo hace creando una tabla de destino, luego un archivo de mapeo de esquema que asigna los elementos xml a las columnas de la tabla.

El tuyo puede verse un poco así:

 create table event ( Type nvarchar(50), Name nvarchar(50), Duration nvarchar(50)) 

y esto:

 < ?xml version="1.0" ?>              

Luego puede cargar su XML en su tabla usando el cargador masivo XML.

http://support.microsoft.com/kb/316005

Si necesita hacerlo sin la variable XML (desde cadena en la función de valor de tabla)

 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"?>   1 A RFC 1035[1] Address record 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.   2 NS RFC 1035[1] Name server record Delegates a DNS zone to use the given authoritative name servers   ' AS xml) AS RawXml ) AS b --CROSS APPLY b.RawXml.nodes('//record/ID') myTempTable(XmlCol); CROSS APPLY b.RawXml.nodes('//record') myTempTable(XmlCol); 

O desde el archivo:

 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); 

p.ej

 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('' + REPLACE(@bla, ',', '') + '' AS xml) AS RawXml ) AS b CROSS APPLY b.RawXml.nodes('e') x(XmlCol); 

Entonces puedes tener una función como

 SELECT * FROM MyTable WHERE UID IN ( SELECT x.XmlCol.value('.', 'varchar(36)') AS val FROM ( SELECT CAST('' + REPLACE(@bla, ',', '') + '' AS xml) AS RawXml ) AS b CROSS APPLY b.RawXml.nodes('e') x(XmlCol) ) 

Si intenta importar su XML como un campo XML “puro” debe crear una tabla como esta (obviamente con muchos otros campos como quiera):

 CREATE TABLE [dbo].[TableXML]( [ID] [int] IDENTITY(1,1) NOT NULL, [XmlContent] [xml] NOT NULL -- specify [xml] type ) 

Luego puede insertar fácilmente su XML como una cadena:

 INSERT INTO [dbo].[TableXML] ([XmlContent]) VALUES ('< ?xml version="1.0" encoding="UTF-8"?>   True MainEvent       ') 

Luego, para consultar comenzar desde MSDN t-SQL XML

Si prefiere almacenarlo como cadena, utilice varchar (max) en lugar del tipo de columna [XML] y la misma inserción. Pero si desea consultar fácilmente, sugiero el tipo [XML]. Con el enfoque de cadena plana necesita mucho trabajo a menos que implemente algún código de aplicación para analizarlo y almacenarlo en una tabla plana. Un buen enfoque podría ser un almacenamiento XML en una TABLA “comprimir” y una VISTA para la recuperación de datos con la disposición de campo plano.