sha*_*wty 4 sql-server-2008 xml
我的网络上运行着一组基于 XML 的服务。
这些服务中的数据需要镜像到 SQL Server 2008 实例上的表中。
将 XML 放入表中没有问题我已经可以做到了,但我现在要做的是将一大串 XML 传递给存储过程,然后使用 OPENXML 命令将其插入表中.
我想知道的是,不是使用 3rd 方程序从服务中获取这些数据,然后调用存储的过程并插入它,我是否有可能让 SQL Server 直接从中获取 XML服务 URL 并像这样处理它。
无论我尝试多少次,我似乎都能找到大量关于从服务器文件系统读取文件/从服务器文件系统写入文件的文章和帖子,以及实际插入 XML 数据的几百万条左右的文章,但我似乎无法找到查找有关让服务器直接从 URL 获取数据的任何内容。
干杯
-----====== 更新 25/8/2012 ======--
经过更多的研究,我找到了第三种方法来做到这一点:
declare @xmlObject as int
declare @responseText as varchar(max)
declare @url as varchar(2048)
select @url = 'http://server/feed/data'
exec sp_OACreate 'MSXML2.XMLHTTP', @xmlObject OUT;
exec sp_OAMethod @xmlObject, 'open', NULL, 'get', @url, 'false'
exec sp_OAMethod @xmlObject, 'send'
exec sp_OAMethod @xmlObject, 'responsetext', @responseText OUTPUT
exec sp_OADestroy @xmlObject
select @responseText
exec sp_xml_preparedocument @idoc OUTPUT, @xmlData
Run Code Online (Sandbox Code Playgroud)
这似乎有效,并且工作效率很高,但这是奇怪的事情。
如果我使用完整的 URL,它返回带有 mime 类型“text/xml”的纯 XML 数据,则响应文本不包含任何内容,它为空,但如果我将其剥离为“http://server/feed/”或“ http://server/' 以便网络服务器仅传递 404 页面或默认 html 页面,然后我获取实际页面内容。
起初我认为它可能是 mime 类型,'text/xml' vs 'text/html' 但测试没有区别,任何返回有效 XML 的东西似乎都给 null,但任何返回损坏的 XML 的东西似乎都有效!!
然而,上面的代码确实可以使用来自互联网的正确格式的 XML,例如“geonames”(这是上面代码的原始来源)工作正常。
我怀疑,这与我的提要服务器的配置有关,因此需要做一些工作来解决这个问题,我想我会在此处为其他人添加代码。
@Remus 感谢您的建议,但这就是我目前完成任务的方式,我编写了一个 CLR 二进制文件,每天运行一次以将提要同步到数据库,但同步数据需要很长时间。然而,使用它来提供 XML 比做一个纯循环要快,但是 XML 的大小可能是相当可变的(尤其是考虑到二进制文件会使用 L2S 将它传递给存储过程)并且我已经将输入溢出到SP 几次,因为数据太多,因此我希望让 SP 检索数据本身。
@Mr Browstone - SSIS 似乎是要走的路,这就是其他建议,但是我承认我对使用 SSIS 的了解不多,除了使用(导入/导出向导 - 我更开发人员而不是 DBA :-) ) 所以任何关于我如何使用 SSIS 实现这一目标的指示都会有所帮助。
至于在 DB 中使用 CLR procs,我曾想过尝试,但我之前使用这些东西很糟糕(并且还崩溃了几台服务器!!)所以我对使用它们有点谨慎。
Rem*_*anu 12
使用执行 HTTP 工作和插入数据库的外部进程。我明确建议不要为此使用 SQLCLR。劫持宝贵的 SQL Server工作人员以完成等待 HTTP 结果的无聊工作,有一天会严重影响您的服务器。
但是 XML 的大小可能非常可变(尤其是考虑到二进制文件会使用 L2S 将其传递给存储过程)并且我已经将输入溢出到 SP 几次,因为数据太多
使用DOWNLOAD AND UPLOAD IMAGES FROM SQL SERVER VIA ASP.NET MVC中的技术将 HTTP 响应流式传输到数据库中。
小智 5
我广泛使用 sp_OACreate 来做你正在做的事情。我怀疑您的问题可能是您收到的 XML 数据的大小超过 8000 个字符。(即当您超过 8000 个字符时,SQL 可能不会返回任何数据)。
sp_OAGetProperty 和其他扩展存储过程不能传递 varchar(MAX) 参数
作为一种变通方法,您可以将结果插入到表或表变量中。这样,您可以使用 sp_OACreate 成功接收任何大小的文本(html 或 xml)。
例子:
INSERT INTO @tvResponse (Response)
EXEC @LastResultCode = sp_OAGetProperty @Obj, 'responseText' --, @Response OUT
--Note: sp_OAGetProperty (or any extended stored procedure parameter) does not support
--varchar(MAX), however returning as a resultset will return long results.
Run Code Online (Sandbox Code Playgroud)
此外,我还发布了用于检索 HTML 并将其解析为 SQL 表的开源 T-SQL 代码。其中一部分是过程#sputilGetHTTP,它为sp_OAxxx 过程提供了一个很好的包装器:它进行错误处理,使指定各种参数变得容易等。您可以从SourceForge下载。并尝试使用此例程访问您的 XML 结果:您可能会发现它解决了您接收 XML 的问题。
(请注意,#sputilGetHTTP 和其他过程都是作为临时存储过程实现的——没有对数据库进行任何更改,因此在生产环境中使用此代码是安全且容易的。)
另外,我还有一个可以检索 HTTP 数据的 CLR 存储过程。如果它有帮助,我很乐意分享它,但我唯一需要它的时候是我必须检索超过 8000 个字符的二进制(非文本)数据。当我处理文本时,我通常使用上面提到的 TSQL 例程。
归档时间: |
|
查看次数: |
16445 次 |
最近记录: |