SSMS 和 sp_OAMethod:是否存在大于 VARCHAR(8000) 的数据类型?
SSMS and sp_OAMethod: is there a Data Type greater than VARCHAR(8000)?
通过 SSMS 调用 REST 服务确实不是一个好主意。
顺便说一句,自从微软创建了 Stored Procedure sp_OAMethod and even Phil Factor from Red Gate show us how to use it 我想试一试。
我想将一些数据从 OpenStreetMap 直接导入 MSSQL,所以我复制了一个好的查询 from here 并根据我的需要对其进行了调整。
在此示例中,我将返回 Nelson 中的所有电影院:
DECLARE @obj AS INT
DECLARE @Uri AS NVARCHAR(4000)
DECLARE @Response AS VARCHAR(8000)
SET @Uri = 'http://overpass-api.de/api/interpreter?data=area[name="Nelson"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Uri, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'ResponseText', @Response OUTPUT
SELECT @Response [response]
EXEC sp_OADestroy @obj
非常简单,我可以在 Postman 和 SSMS 中看到 REST 调用响应:
当我尝试从像 奥克兰 这样的大城市检索所有电影院时,问题就出现了:
DECLARE @obj AS INT
DECLARE @Uri AS NVARCHAR(4000)
DECLARE @Response AS VARCHAR(8000)
SET @Uri = 'http://overpass-api.de/api/interpreter?data=area[name="Auckland"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Uri, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'ResponseText', @Response OUTPUT
SELECT @Response [response]
EXEC sp_OADestroy @obj
REST 调用正在检索更多数据,变量 @Response AS VARCHAR(8000)
无法保存所有数据:
当然我尝试使用 DECLARE @Response AS VARCHAR(MAX)
但这也无济于事。
不应该 VARCHAR(MAX)
保存 65,535 个字符 直到 2GB 的数据?
我应该改用什么?
有没有办法拆分数据并稍后连接?
编辑: 我想我越来越接近了:我可以使用 OPENJSON this way,但我仍然不知道如何构造查询...任何帮助将不胜感激
错误代码:
DECLARE @str varchar(max)
SET @str = REPLICATE('A', 4000) + REPLICATE('B', 4000) + REPLICATE('C', 4000)
PRINT LEN(@str)
来自 REPLICATE in SQL Server 文档
If string_expression is not of type varchar(max) or nvarchar(max),
REPLICATE truncates the return value at 8,000 bytes. To return values
greater than 8,000 bytes, string_expression must be explicitly cast to
the appropriate large-value data type.
正确代码:
DECLARE @str varchar(max)
DECLARE @seed varchar(max) = 'A'
SET @str = REPLICATE(@seed, 4000) + REPLICATE(@seed, 4000) + REPLICATE(@seed, 4000)
PRINT LEN(@str)
--12000
其他答案,参见For Nvarchar(Max) I am only getting 4000 characters in TSQL?
我在给自己鼓掌。
我承认,这是一个噩梦般的解决方案,但它可以解决问题。解决方案是设置:
Declare @Response as table(Json_Table nvarchar(max))
这样我创建了一个 table 数据类型 nvarchar(max)
现在是的,它可以容纳 65,535 个字符 直到 2GB 数据。
Declare @Object as Int;
DECLARE @hr int
Declare @Response as table(Json_Table nvarchar(max))
Exec @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;
Exec @hr=sp_OAMethod @Object, 'open', NULL, 'get',
'http://overpass-api.de/api/interpreter?data=[out:json];area[name="Auckland"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;', --Your Web Service Url (invoked)
'false'
Exec @hr=sp_OAMethod @Object, 'send'
Exec @hr=sp_OAMethod @Object, 'responseText', @Response OUTPUT
INSERT into @Response (Json_Table) exec sp_OAGetProperty @Object, 'responseText'
select * from @Response
EXEC sp_OADestroy @Object
请post如果您找到更好的解决方案,将不胜感激。
通过 SSMS 调用 REST 服务确实不是一个好主意。
顺便说一句,自从微软创建了 Stored Procedure sp_OAMethod and even Phil Factor from Red Gate show us how to use it 我想试一试。
我想将一些数据从 OpenStreetMap 直接导入 MSSQL,所以我复制了一个好的查询 from here 并根据我的需要对其进行了调整。
在此示例中,我将返回 Nelson 中的所有电影院:
DECLARE @obj AS INT
DECLARE @Uri AS NVARCHAR(4000)
DECLARE @Response AS VARCHAR(8000)
SET @Uri = 'http://overpass-api.de/api/interpreter?data=area[name="Nelson"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Uri, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'ResponseText', @Response OUTPUT
SELECT @Response [response]
EXEC sp_OADestroy @obj
非常简单,我可以在 Postman 和 SSMS 中看到 REST 调用响应:
当我尝试从像 奥克兰 这样的大城市检索所有电影院时,问题就出现了:
DECLARE @obj AS INT
DECLARE @Uri AS NVARCHAR(4000)
DECLARE @Response AS VARCHAR(8000)
SET @Uri = 'http://overpass-api.de/api/interpreter?data=area[name="Auckland"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Uri, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'ResponseText', @Response OUTPUT
SELECT @Response [response]
EXEC sp_OADestroy @obj
REST 调用正在检索更多数据,变量 @Response AS VARCHAR(8000)
无法保存所有数据:
当然我尝试使用 DECLARE @Response AS VARCHAR(MAX)
但这也无济于事。
不应该 VARCHAR(MAX)
保存 65,535 个字符 直到 2GB 的数据?
我应该改用什么?
有没有办法拆分数据并稍后连接?
编辑: 我想我越来越接近了:我可以使用 OPENJSON this way,但我仍然不知道如何构造查询...任何帮助将不胜感激
错误代码:
DECLARE @str varchar(max)
SET @str = REPLICATE('A', 4000) + REPLICATE('B', 4000) + REPLICATE('C', 4000)
PRINT LEN(@str)
来自 REPLICATE in SQL Server 文档
If string_expression is not of type varchar(max) or nvarchar(max), REPLICATE truncates the return value at 8,000 bytes. To return values greater than 8,000 bytes, string_expression must be explicitly cast to the appropriate large-value data type.
正确代码:
DECLARE @str varchar(max)
DECLARE @seed varchar(max) = 'A'
SET @str = REPLICATE(@seed, 4000) + REPLICATE(@seed, 4000) + REPLICATE(@seed, 4000)
PRINT LEN(@str)
--12000
其他答案,参见For Nvarchar(Max) I am only getting 4000 characters in TSQL?
我在给自己鼓掌。
我承认,这是一个噩梦般的解决方案,但它可以解决问题。解决方案是设置:
Declare @Response as table(Json_Table nvarchar(max))
这样我创建了一个 table 数据类型 nvarchar(max)
现在是的,它可以容纳 65,535 个字符 直到 2GB 数据。
Declare @Object as Int;
DECLARE @hr int
Declare @Response as table(Json_Table nvarchar(max))
Exec @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;
Exec @hr=sp_OAMethod @Object, 'open', NULL, 'get',
'http://overpass-api.de/api/interpreter?data=[out:json];area[name="Auckland"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;', --Your Web Service Url (invoked)
'false'
Exec @hr=sp_OAMethod @Object, 'send'
Exec @hr=sp_OAMethod @Object, 'responseText', @Response OUTPUT
INSERT into @Response (Json_Table) exec sp_OAGetProperty @Object, 'responseText'
select * from @Response
EXEC sp_OADestroy @Object
请post如果您找到更好的解决方案,将不胜感激。