简体   繁体   English

如何将xml文件加载到SQL Server表中

[英]How to load an xml file into a SQL Server table

I searched in the internet and there is not good example for converting xml file into SQL Server table. 我在互联网上搜索,没有很好的示例将xml文件转换为SQL Server表。

I have this file: 我有这个文件:

<http://www.ims.gov.il/ims/PublicXML/isr_cities.xml>

This is a weather file for 15 cities (for the next 4 days). 这是15个城市(未来4天)的天气文件。

How can I load it to a flat table in SQL Server? 如何将其加载到SQL Server的平面表中?

I try and it just give me null's :-( 我尝试,它只是给我null :-(

I put out some value's that made problems but still I can't convert it to a big flat table. 我提出了一些会带来问题的价值,但仍然无法将其转换为大型平板。

How can I put out all the nodes inside the xml file? 如何放置xml文件中的所有节点?

Thanks! 谢谢!

You can try something like this (assuming you have your XML in a SQL Server variable called @input XML ): 您可以尝试执行以下操作(假设您将XML放在名为@input XML的SQL Server变量中):

SELECT
    LocationId = XC2.value('(LocationId)[1]', 'int'),
    LocNameEng = XC2.value('(LocationNameEng)[1]', 'varchar(100)'),
    TheDate = XCE.value('(../Date)[1]', 'DATE'),
    ElementName = XCE.value('(ElementName)[1]', 'varchar(50)'),
    ElementValue = XCE.value('(ElementValue)[1]', 'varchar(50)')
FROM
    @input.nodes('/IsraelCitiesWeatherForecastEvening/Location') AS XT(XC)
CROSS APPLY
    XC.nodes('LocationMetaData') AS XT2(XC2)
CROSS APPLY
    XC.nodes('LocationData/TimeUnitData/Element') AS XTE(XCE)

That should give you at least some output and can server as a starting point for more exploration! 那应该至少给您一些输出,并且可以作为服务器进行更多探索的起点!

I think this might be what you want. 我想这可能就是您想要的。 After the call you can do with the XML what ever you want... 通话之后,您可以随心所欲地使用XML。

--you need to allow this:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

DECLARE  @URL VARCHAR(MAX) = 'http://www.ims.gov.il/ims/PublicXML/isr_cities.xml';

DECLARE @xmlT TABLE (yourXML XML);
DECLARE @Response NVARCHAR(MAX);
DECLARE @XML XML;
DECLARE @Obj INT;
DECLARE @Result INT;
DECLARE @HTTPStatus INT;
DECLARE @ErrorMsg NVARCHAR(MAX);

EXEC @Result = sp_OACreate 'MSXML2.XMLHttp', @Obj OUT ;
EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, false;
EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded';
EXEC @Result = sp_OAMethod @Obj, SEND, NULL, '';
EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT ;

INSERT @xmlT ( yourXML )
EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml';

SELECT * FROM @xmlT;

the problem was in my local setting... 问题出在我的本地环境中...

here anyway my code after improving. 无论如何,在这里我的代码经过改进。 I still working on it... thank's to all of you! 我还在努力中...谢谢大家!

DECLARE @WeatherXML xml 
SET @WeatherXML = (  SELECT  *      FROM    
           OPENROWSET (BULK 'C:\Stam\isr_cities.xml', SINGLE_BLOB) AS FileImport (XMLDATA))
SELECT 
        wXML.query('../../../LocationMetaData/LocationId').value('.','NVARCHAR(30)'), 
        wXML.query('../../../LocationMetaData/LocationNameEng').value('.','NVARCHAR(30)'), 
        wXML.query('../../../LocationMetaData/LocationNameHeb').value('.','NVARCHAR(30)'), 
        wXML.query('../../../LocationMetaData/DisplayLat').value('.','NVARCHAR(30)'), 
        wXML.query('../../../LocationMetaData/DisplayLon').value('.','NVARCHAR(30)'),
        wXML.query('../Date').value('.','NVARCHAR(30)'), 
        wXML.query('ElementName').value('.','NVARCHAR(30)'), 
        wXML.query('ElementValue').value('.','NVARCHAR(30)')
FROM @WeatherXML.nodes('/IsraelCitiesWeatherForecastMorning/Location/LocationData/TimeUnitData/Element') AS XmlData(wXML)

I must need the element node, but for begining I did something like this: 我必须需要element节点,但首先我要做的是这样的:

DECLARE @WeatherXML xml 
SET @WeatherXML = (  SELECT  *  FROM    
        OPENROWSET (BULK 'C:\Stam\isr_citiesNEW.xml', SINGLE_BLOB) AS FileImport (XMLDATA))

-- insert xml to [MOT_Temp_WeatherXML] table
INSERT INTO [dbo].[MOT_Temp_WeatherXML]
           ([LocationId]
           ,[LocationNameEng]
           ,[LocationNameHeb]
           ,[DisplayLat]
           ,[DisplayLon]
           )SELECT 
                    wXML.query('LocationId').value('.','NVARCHAR(30)'), 
                    wXML.query('LocationNameEng').value('.','NVARCHAR(30)'), 
                    wXML.query('LocationNameHeb').value('.','NVARCHAR(30)'), 
                    wXML.query('DisplayLat').value('.','NVARCHAR(30)'), 
                    wXML.query('DisplayLon').value('.','NVARCHAR(30)')
            FROM    @WeatherXML.nodes('/IsraelCitiesWeatherForecastMorning/Location/LocationMetaData') AS XmlData(wXML)

SELECT * FROM [MOT_Temp_WeatherXML]

after that i get in the results: 之后,我得到结果:

<LocationId>520</LocationId> 

and so on... instead of just 520... 等等...而不是520 ...

but again, if i get the element node i will be happy... 但是再次,如果我得到了元素节点,我会很高兴...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM