0

我有以下问题。在我们的服务器上运行下面的 sql 它会返回预期的结果。在另一台服务器上运行相同,它不会返回任何值。

做了以下事情:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

USE tempdb
GO

IF OBJECT_ID('tempdb..#xml') IS NOT NULL DROP TABLE #xml
CREATE TABLE #xml ( yourXML XML )
GO

DECLARE @URL VARCHAR(8000)

--DECLARE @QS varchar(50)

-- & or ? depending if there are other query strings
-- Use this for when there is other query strings:
--SELECT @QS = '&date='+convert(varchar(25),getdate(),126)
-- Use this for when there is NO other query strings:
-- SELECT @QS = '?date='+convert(varchar(25),getdate(),126)
SELECT @URL = 'http://exampleURL' -- + @QS

DECLARE @Response varchar(8000)
DECLARE @XML xml
DECLARE @Obj int
DECLARE @Result int
DECLARE @HTTPStatus int
DECLARE @ErrorMsg varchar(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 #xml ( yourXML )
EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'--, @Response OUT


declare @input XML=(
SELECT
yourXML
from
#xml)

SELECT
Item.value('(Code)[1]', 'nvarchar(max)') as Code,
Item.value('(Description)[1]', 'varchar(max)') as Description,
Item.value('(ImageUrl)[1]', 'nvarchar(max)') as ImageUrl
from
@input.nodes('//product') AS T(Item)

在第二个服务器中,@input 返回 null。有一个代理可以访问服务器上的站点,它使用 sql server 2008 运行。

任何想法为什么是空值?

4

2 回答 2

1

我刚刚遇到了类似的问题,使用 Ole Automation 的查询突然返回 null 而没有任何错误。更改'MSXML2.XMLHttp'为后'MSXML2.ServerXMLHTTP',它又开始工作了。

要详细了解这两者之间的区别,请参阅本文和 Microsoft文档。我从微软网站复制了一些,以防两个网站将来都关闭。

ServerXMLHTTP 对象提供类似于 XMLHTTP 对象的功能。然而,与 XMLHTTP 不同的是,ServerXMLHTTP 对象不依赖 WinInet 控件来对远程 XML 文档进行 HTTP 访问。ServerXMLHTTP 使用新的 HTTP 客户端堆栈。WinInet 的这个服务器安全子集专为服务器应用程序而设计,具有以下优点:

  • 可靠性——HTTP 客户端堆栈提供更长的正常运行时间。新的 HTTP 子集中不包括对服务器应用程序不重要的 WinInet 功能,例如 URL 缓存、代理服务器的自动发现、HTTP/1.1 分块、脱机支持以及对 Gopher 和 FTP 协议的支持。
  • 安全性——HTTP 客户端堆栈不允许与另一个用户的会话共享用户特定的状态。ServerXMLHTTP 提供对客户端证书的支持。
于 2019-05-10T15:13:43.313 回答
0

所以,我的问题似乎是我无法从我的 SQL 服务器通过 Internet 访问,所以我不得不使用下面的行来设置代理。

exec @Result = sp_OAMethod @Obj, 'setProxy', NULL, '2', 'http://myProxy'

一旦这个被排序,我设法得到我的结果。

于 2020-06-04T08:49:59.643 回答