代码之家  ›  专栏  ›  技术社区  ›  Francesco Mantovani

SSMS和sp\OAMethod:是否存在大于VARCHAR(8000)的数据类型?

  •  0
  • Francesco Mantovani  · 技术社区  · 6 年前

    通过SSMS调用REST服务确实不是一个好主意。

    Stored Procedure sp_OAMethod 甚至是红门的菲尔 show us how to use it 我想试一试。

    我想将OpenStreetMap中的一些数据直接导入MSSQL,所以我复制了一个好的查询 from here

    在这个例子中,我返回所有的电影院 纳尔逊 :

    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中看到其余的呼叫响应:

    enter image description here

    当我试图从一个更大的城市取回所有的电影院时,问题就开始了 奥克兰 :

    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
    

    @Response AS VARCHAR(8000) 无法保存所有数据:

    enter image description here

    当然我试过用 DECLARE @Response AS VARCHAR(MAX)

    不应该 VARCHAR(MAX) 持有 直到 2GB的 什么数据?

    我应该用什么来代替?

    有没有一种方法可以在以后分割数据并连接起来?

    编辑: 我想我越来越接近了:我可以使用OPENJSON this way ,但我仍然不知道如何构造查询。。。任何帮助都将不胜感激

    2 回复  |  直到 6 年前
        1
  •  5
  •   Francesco Mantovani    6 年前

    我在为自己鼓掌。

    我承认,这是一个噩梦般的解决方案,但它能把事情完成。解决方案是:

    Declare @Response as table(Json_Table nvarchar(max))

    这样我创建了一个数据类型为 nvarchar(max) 现在是的,它可以容纳 大量的数据。

    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
    

    请张贴如果你找到更好的解决方案,将不胜感激。

        2
  •  1
  •   gbn    6 年前

    错误代码:

    DECLARE @str varchar(max)
    SET @str = REPLICATE('A', 4000) + REPLICATE('B', 4000) + REPLICATE('C', 4000)
    PRINT LEN(@str)
    

    REPLICATE in SQL Server 文件

    如果字符串表达式不是varchar(max)或nvarchar(max)类型, 大于8000字节,字符串\u表达式必须显式转换为 适当的大值数据类型。

    正确代码:

    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?

    推荐文章