0

0

sqlserver调用qqmap服务,根据地点获取所在城市

php中文网

php中文网

发布时间:2016-06-07 16:13:12

|

1432人浏览过

|

来源于php中文网

原创

sqlserver 调用qq map 服务,根据地点获取所在城市 首先需要解决的是如何在SQL SERVER中调用web service,其次是针对web service的返回json进行解析; 1、调用web service create proc getCityByPosition( @url varchar(2048) --Your Web Service Url (invoke

sqlserver 调用qq map 服务,根据地点获取所在城市

首先需要解决的是如何在sql server中调用web service,其次是针对web service的返回值json进行解析;

1、调用web service

Etna
Etna

Etna:用文字做AI世界的造物主

下载

create proc getCityByPosition(
    @url varchar(2048) --Your Web Service Url (invoked)
)
as
declare @Object as Int;
declare @ResponseText as Varchar(8000);
declare @resultStr varchar(2048)

-- exec getCityByPosition 'http://apis.map.qq.com/ws/geocoder/v1/?location=34.287100,117.255000&key=K76BZ-W3O2Q-RFL5S-GXOPR-3ARIT-6KFE5&output=json&&callback=?'

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get',@url,'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
 
Select top 1 StringValue
    from parseJSON(@ResponseText) where name = 'city';

Exec sp_OADestroy @Object

执行测试可能报错,提示更改全局配置,需管理员执行下面代码:

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

2、解析json字符串,使用自定义函数parseJSON

USE [pm_v3]
GO
/****** Object:  UserDefinedFunction [dbo].[parseJSON]    Script Date: 01/02/2015 18:06:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
       
      
    ALTER FUNCTION [dbo].[parseJSON]( @JSON NVARCHAR(MAX))  
    RETURNS @hierarchy TABLE  
      (  
       element_id INT IDENTITY(1, 1) NOT NULL, /* internal surrogate primary key gives the order of parsing and the list order */  
       parent_ID INT,/* if the element has a parent then it is in this column. The document is the ultimate parent, so you can get the structure from recursing from the document */  
       Object_ID INT,/* each list or object has an object id. This ties all elements to a parent. Lists are treated as objects here */  
       NAME VARCHAR(2000),/* the name of the object */  
       StringValue VARCHAR(MAX) NOT NULL,/*the string representation of the value of the element. */  
       ValueType VARCHAR(10) NOT null /* the declared type of the value represented as a string in StringValue*/  
      )  
    AS  
    BEGIN  
      DECLARE  
        @FirstObject INT, --the index of the first open bracket found in the JSON string  
        @OpenDelimiter INT,--the index of the next open bracket found in the JSON string  
        @NextOpenDelimiter INT,--the index of subsequent open bracket found in the JSON string  
 【本文来自鸿网互联 (http://www.68idc.cn)】       @NextCloseDelimiter INT,--the index of subsequent close bracket found in the JSON string  
        @Type NVARCHAR(10),--whether it denotes an object or an array  
        @NextCloseDelimiterChar CHAR(1),--either a '}' or a ']'  
        @Contents NVARCHAR(MAX), --the unparsed contents of the bracketed expression  
        @Start INT, --index of the start of the token that you are parsing  
        @end INT,--index of the end of the token that you are parsing  
        @param INT,--the parameter at the end of the next Object/Array token  
        @EndOfName INT,--the index of the start of the parameter at end of Object/Array token  
        @token NVARCHAR(200),--either a string or object  
        @value NVARCHAR(MAX), -- the value as a string  
        @name NVARCHAR(200), --the name as a string  
        @parent_ID INT,--the next parent ID to allocate  
        @lenJSON INT,--the current length of the JSON String  
        @characters NCHAR(36),--used to convert hex to decimal  
        @result BIGINT,--the value of the hex symbol being parsed  
        @index SMALLINT,--used for parsing the hex value  
        @Escape INT --the index of the next escape character  
          
       
      
      DECLARE @Strings TABLE /* in this temporary table we keep all strings, even the names of the elements, since they are 'escaped' in a different way, and may contain, unescaped, brackets denoting objects or lists. These are replaced in the JSON string by tokens representing the string */  
        (  
         String_ID INT IDENTITY(1, 1),  
         StringValue NVARCHAR(MAX)  
        )  
      SELECT--initialise the characters to convert hex to ascii  
        @characters='0123456789abcdefghijklmnopqrstuvwxyz',  
      /* firstly we process all strings. This is done because [{} and ] aren't escaped in strings, which complicates an iterative parse. */  
        @parent_ID=0;  
      WHILE 1=1 --forever until there is nothing more to do  
        BEGIN  
          SELECT  
            @start=PATINDEX('%[^a-zA-Z]["]%', @json);--next delimited string  
          IF @start=0 BREAK --no more so drop through the WHILE loop  
          IF SUBSTRING(@json, @start+1, 1)='"'   
            BEGIN --Delimited Name  
              SET @start=@Start+1;  
              SET @end=PATINDEX('%[^\]["]%', RIGHT(@json, LEN(@json+'|')-@start));  
            END  
          IF @end=0 --no end delimiter to last string  
            BREAK --no more  
          SELECT @token=SUBSTRING(@json, @start+1, @end-1)  
          --now put in the escaped control characters  
          SELECT @token=REPLACE(@token, FROMString, TOString)  
          FROM  
            (SELECT  
              '\"' AS FromString, '"' AS ToString  
             UNION ALL SELECT '\\', '\'  
             UNION ALL SELECT '\/', '/'  
             UNION ALL SELECT '\b', CHAR(08)  
             UNION ALL SELECT '\f', CHAR(12)  
             UNION ALL SELECT '\n', CHAR(10)  
             UNION ALL SELECT '\r', CHAR(13)  
             UNION ALL SELECT '\t', CHAR(09)  
            ) substitutions  
          SELECT @result=0, @escape=1  
      --Begin to take out any hex escape codes  
          WHILE @escape>0  
            BEGIN  
              SELECT @index=0,  
              --find the next hex escape sequence  
              @escape=PATINDEX('%\x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]%', @token)  
              IF @escape>0 --if there is one  
                BEGIN  
                  WHILE @index<4 --there are always four digits to a \x sequence     
                    BEGIN   
                      SELECT --determine its value  
                        @result=@result+POWER(16, @index)  
                        *(CHARINDEX(SUBSTRING(@token, @escape+2+3-@index, 1),  
                                    @characters)-1), @index=@index+1 ;  
               
                    END  
                    -- and replace the hex sequence by its unicode value  
                  SELECT @token=STUFF(@token, @escape, 6, NCHAR(@result))  
                END  
            END  
          --now store the string away   
          INSERT INTO @Strings (StringValue) SELECT @token  
          -- and replace the string with a token  
          SELECT @JSON=STUFF(@json, @start, @end+1,  
                        '@string'+CONVERT(NVARCHAR(5), @@identity))  
        END  
      -- all strings are now removed. Now we find the first leaf.    
      WHILE 1=1  --forever until there is nothing more to do  
      BEGIN  
       
      
      SELECT @parent_ID=@parent_ID+1  
      --find the first object or list by looking for the open bracket  
      SELECT @FirstObject=PATINDEX('%[{[[]%', @json)--object or array  
      IF @FirstObject = 0 BREAK  
      IF (SUBSTRING(@json, @FirstObject, 1)='{')   
        SELECT @NextCloseDelimiterChar='}', @type='object'  
      ELSE   
        SELECT @NextCloseDelimiterChar=']', @type='array'  
      SELECT @OpenDelimiter=@firstObject  
       
      
      WHILE 1=1 --find the innermost object or list...  
        BEGIN  
          SELECT  
            @lenJSON=LEN(@JSON+'|')-1  
      --find the matching close-delimiter proceeding after the open-delimiter  
          SELECT  
            @NextCloseDelimiter=CHARINDEX(@NextCloseDelimiterChar, @json,  
                                          @OpenDelimiter+1)  
      --is there an intervening open-delimiter of either type?  
          SELECT @NextOpenDelimiter=PATINDEX('%[{[[]%',  
                 RIGHT(@json, @lenJSON-@OpenDelimiter))--object  
          IF @NextOpenDelimiter=0 --then we are done.  
            BREAK  
          SELECT @NextOpenDelimiter=@NextOpenDelimiter+@OpenDelimiter  
          IF @NextCloseDelimiter<@NextOpenDelimiter --we have found the next leaf  
            BREAK   
          --we prepare to walk the document further  
          IF SUBSTRING(@json, @NextOpenDelimiter, 1)='{'   
            SELECT @NextCloseDelimiterChar='}', @type='object'  
          ELSE   
            SELECT @NextCloseDelimiterChar=']', @type='array'  
          SELECT @OpenDelimiter=@NextOpenDelimiter  
        END  
      /*and now we can parse out the list or name/value pairs. We first pull out the structure into the variable '@contents' and replace it in the JSON document with a token representing it.*/  
      SELECT  
        @contents=SUBSTRING(@json, @OpenDelimiter+1,  
                            @NextCloseDelimiter-@OpenDelimiter-1)  
      SELECT  
        @JSON=STUFF(@json, @OpenDelimiter,  
                    @NextCloseDelimiter-@OpenDelimiter+1,  
                    '@'+@type+CONVERT(NVARCHAR(5), @parent_ID))  
     /*and do each name/value pair, or just value, in the case of an ordered value list.  */              
      WHILE (PATINDEX('%[A-Za-z0-9@+.e]%', @contents))<>0   
        BEGIN  
          IF @Type='Object' /*it will be a 0-n list containing a string followed by a string, number,boolean, or null*/  
            BEGIN  
              SELECT  
                @end=CHARINDEX(':', ' '+@contents) /*if there is anything, it will be a string-based name.*/  
              SELECT  @start=PATINDEX('%[^A-Za-z@][@]%', ' '+@contents)--find out what the token is  
              SELECT @token=SUBSTRING(' '+@contents, @start+1, @End-@Start-1),  
                @endofname=PATINDEX('%[0-9]%', @token),--and find out the number so as to fish out the string  
                @param=RIGHT(@token, LEN(@token)-@endofname+1)  
              SELECT--separate the token from the contents of the structure (chop, chop0  
                @token=LEFT(@token, @endofname-1),  
                @Contents=RIGHT(' '+@contents, LEN(' '+@contents+'|')-@end-1)  
              --now we get the string we have stored (names are stored as strings)  
              SELECT  @name=stringvalue FROM @strings  
                WHERE string_id=@param --fetch the name  
            END  
          ELSE --it is merely a value in an ordered list, without a name  
            SELECT @Name=null    
          SELECT  
            @end=CHARINDEX(',', @contents)-- a string-token, object-token, list-token, number,boolean, or null  
          IF @end=0 --then we're at the end of the list  
            SELECT @end=PATINDEX('%[A-Za-z0-9@+.e][^A-Za-z0-9@+.e]%', @Contents+' ')  
              +1  
          SELECT @start=PATINDEX('%[^A-Za-z0-9@+.e][A-Za-z0-9@+.e]%', ' '+@contents)  
          SELECT --get the value and snip the contents  
            @Value=RTRIM(SUBSTRING(@contents, @start, @End-@Start)),  
            @Contents=RIGHT(@contents+' ', LEN(@contents+'|')-@end)  
          IF SUBSTRING(@value, 1, 7)='@object'   
            INSERT INTO @hierarchy  
              (NAME, parent_ID, StringValue, Object_ID, ValueType)  
              SELECT @name, @parent_ID, SUBSTRING(@value, 8, 5),  
                SUBSTRING(@value, 8, 5), 'object'   
          ELSE   
            IF SUBSTRING(@value, 1, 6)='@array'   
              INSERT INTO @hierarchy  
                (NAME, parent_ID, StringValue, Object_ID, ValueType)  
                SELECT @name, @parent_ID, SUBSTRING(@value, 7, 5),  
                  SUBSTRING(@value, 7, 5), 'array'   
            ELSE   
              IF SUBSTRING(@value, 1, 7)='@string' --it is a string  
                INSERT INTO @hierarchy  
                  (NAME, parent_ID, StringValue, ValueType)  
                  SELECT @name, @parent_ID, stringvalue, 'string'  
                  FROM @strings  
                  WHERE string_id=SUBSTRING(@value, 8, 5)  
              ELSE   
                IF @value IN ('true', 'false')--a boolean!   
                  INSERT INTO @hierarchy  
                    (NAME, parent_ID, StringValue, ValueType)  
                    SELECT @name, @parent_ID, @value, 'boolean'  
                ELSE   
                  IF @value='null' --it is a null  
                    INSERT INTO @hierarchy  
                      (NAME, parent_ID, StringValue, ValueType)  
                      SELECT @name, @parent_ID, @value, 'null'  
                  ELSE   
                    IF PATINDEX('%[^0-9]%', @value)>0 --a real number  
                      INSERT INTO @hierarchy  
                        (NAME, parent_ID, StringValue, ValueType)  
                        SELECT @name, @parent_ID, @value, 'real'  
                    ELSE --it must be an INT  
                      INSERT INTO @hierarchy  
                        (NAME, parent_ID, StringValue, ValueType)  
                        SELECT @name, @parent_ID, @value, 'int'  
       
      
        END  
      END  
    --and so lastly we put the root into the hierarchy.  
    INSERT INTO @hierarchy (NAME, parent_ID, StringValue, Object_ID, ValueType)  
      SELECT '-', NULL, '', @parent_id-1, @type  
    --  
       RETURN  
    END  


相关文章

QQ
QQ

QQ是腾讯在中国开发的一款社交应用,用户可用QQ在手机和电脑上聊天。QQ截止目前拥有超过8.2亿用户,是中国最多人使用的社交应用程序之一,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

28

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

8

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

31

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

35

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

12

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

40

2026.01.26

抖币充值官方网站 抖币性价比充值链接地址
抖币充值官方网站 抖币性价比充值链接地址

网页端充值步骤:打开浏览器,输入https://www.douyin.com,登录账号;点击右上角头像,选择“钱包”;进入“充值中心”,操作和APP端一致。注意:切勿通过第三方链接、二维码充值,谨防受骗

7

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.4万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.9万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号