Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 server 如何将xml文件加载到SQL Server表中_Sql Server_Xml - Fatal编程技术网

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

Sql server 如何将xml文件加载到SQL Server表中,sql-server,xml,Sql Server,Xml,我在互联网上搜索过,没有很好的例子可以将xml文件转换成SQL Server表 我有这个档案: <http://www.ims.gov.il/ims/PublicXML/isr_cities.xml> 这是15个城市(未来4天)的天气文件 如何将其加载到SQL Server中的平面表中 我试过了,它只给我空的:-( 我提出了一些会产生问题的值,但仍然无法将其转换为一个大的平面表 如何输出xml文件中的所有节点 谢谢!您可以尝试类似的方法(假设您的XML位于名为@input XM

我在互联网上搜索过,没有很好的例子可以将xml文件转换成SQL Server表

我有这个档案:

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

这是15个城市(未来4天)的天气文件

如何将其加载到SQL Server中的平面表中

我试过了,它只给我空的:-(

我提出了一些会产生问题的值,但仍然无法将其转换为一个大的平面表

如何输出xml文件中的所有节点


谢谢!

您可以尝试类似的方法(假设您的XML位于名为
@input XML
的SQL Server变量中):


这至少会给您一些输出,并且可以将服务器作为更多探索的起点!

您可以尝试类似的方法(假设您的XML位于名为
@input XML
的SQL server变量中):


这至少会给您一些输出,并可以将服务器作为更多探索的起点!

我认为这可能是您想要的。通话后,您可以使用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;

我想这可能是你想要的。打电话后,你可以用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;

我必须需要元素节点,但开始时我做了如下操作:

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]
之后我得到了结果:

<LocationId>520</LocationId> 
520
等等…而不是仅仅520


但同样,如果我得到元素节点,我会很高兴…

我必须需要元素节点,但开始时我做了如下操作:

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]
之后我得到了结果:

<LocationId>520</LocationId> 
520
等等…而不是仅仅520


但是,如果我得到元素节点,我会很高兴…

问题出在我的本地设置中

这是我改进后的代码。我还在努力。。。 谢谢大家

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)

问题出在我当地的环境

这是我改进后的代码。我还在努力。。。 谢谢大家

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)

从URL检索此文件有问题吗?或者您已经加载了此内容,并且希望从中读取值吗?您不能仅使用此类数据创建一个平面表格。这是高度嵌套的…最后一点是:您的问题(正如您在此处提出的)确实具有误导性,请尝试以SO用户的头脑思考。从e title您想将文件加载到某种表中。问题中有一个URL作为文件源。您真正的问题是如何从文件系统中读取XML文件?或者是如何从我拥有的XML中获取值?总之:愉快的编码和一个提示:您不应该更改您的标识:-)想把你推过15个代表点,让你可以投一个捐款,但这两个沙龙是不同的帐户?!快乐编码!从URL中检索此文件是否有问题,或者是否已加载此内容并希望从中读取值?不能仅使用此类数据创建平面表。这是高度嵌套的…还有最后一条评论:你的问题——正如你在这里所说的——确实是误导性的,请试着用用户的头脑来思考。从标题中,您要将文件加载到一种表中。问题中有一个URL作为文件源。您真正的问题是如何从文件系统中读取XML文件?或者是如何从我拥有的XML中获取值?无论如何:快乐的编码和一个提示:你不应该改变你的身份:-)想把你推到神奇的15个代表点,使你能够投票一个贡献,但两个沙龙是不同的帐户?!快乐编码!嗨,莎伦,因为你是新来的,所以,请允许我一些提示:答案只是建议解决上面的问题。如果你想加强你的问题,添加更多细节,澄清它,只需使用问题下方的编辑选项,并在那里这样做。嗨,莎伦,你说“谢谢”真是太好了,但这会对Thx更友好!嗨,莎伦,因为你是新来的,所以,请允许我一些提示:答案只是建议解决上面的问题。如果你想加强你的问题,添加更多细节,澄清它,只需使用问题下方的编辑选项,并在那里这样做。嗨,莎伦,你说“谢谢”真是太好了,但这会对Thx更友好!嗨,莎伦,再一次给你一些提示。。。添加一个答案并写上“谢谢大家”是很好的,但用户不会发现这一点(除非他们再次访问他们的答案以检查是否有新的内容。而是在用户的答案下方添加一条评论,并将用户名加上一个at(例如,
@Shnugo
)。这将触发一个通知。顺便说一句:@marc_s读取XML的方式似乎更好。您的
.query().value()
可以得到改进…嗨,Sharon,再次给出一些提示…添加一个答案并写上“谢谢大家”很好-但用户不会发现这一点(除非他们再次访问自己的答案以检查是否有新内容。而是在用户答案下方添加注释,并在用户名上添加at(例如,
@Shnugo
)。这将触发通知。顺便说一句:@marc_s读取XML的方式似乎更好。您的
.query().value()
可以改进。。。