• sql查询结果转XML和JSON


    很久之前用到的,现在整理在这,里面一些代码来源于网上,不过有些bug已被我修改了。

    1.查询结果转XML

    DECLARE @ParameterSQL NVARCHAR(MAX)='SELECT * FROM table';
    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @XMLString VARCHAR(MAX)
    DECLARE @XML XML
    DECLARE @Paramlist NVARCHAR(1000)
    SET @Paramlist = N'@XML XML OUTPUT'
    SET @SQL = 'WITH PrepareTable (XMLString)'
    SET @SQL = @SQL + 'AS( '
    SET @SQL = @SQL + @ParameterSQL+ ' FOR XML RAW,TYPE,ELEMENTS'
    SET @SQL = @SQL + ')'
    SET @SQL = @SQL + 'SELECT @XML=[XMLString]FROM[PrepareTable]'
    EXEC sp_executesql @SQL, @Paramlist, @XML=@XML OUTPUT
    SET @XMLString=CAST(@XML AS VARCHAR(MAX))
    SELECT @XML;
    SELECT @XMLString;
    

    其中@ParameterSQL为要查询的语句,@XMLXML格式数据,@XMLStringXML转成字符串


    2.查询结果转JSON

    查询结果转换成json需要经过两个步骤,首先将查询结果转成XML数据,然后通过XML数据转成json
    XML转JSON的存储过程如下:

    CREATE PROCEDURE [dbo].[SerializeJSON] (
         @XML  XML,
         @json_xml  NVARCHAR(MAX) OUTPUT
        )
    AS
    BEGIN
        DECLARE @XMLString NVARCHAR(MAX);
        SET @XMLString = CAST(@XML AS NVARCHAR(MAX));
        BEGIN TRY--//开始捕捉异常
            DECLARE @JSON NVARCHAR(MAX);
            DECLARE @Row VARCHAR(MAX);
            DECLARE @RowStart INT;
            DECLARE @RowEnd INT;
            DECLARE @FieldStart INT;
            DECLARE @FieldEnd INT;
            DECLARE @KEY VARCHAR(MAX);
            DECLARE @Value VARCHAR(MAX);
            DECLARE @StartRoot VARCHAR(100);
            SET @StartRoot = '<row>';
            DECLARE @EndRoot VARCHAR(100);
            SET @EndRoot = '</row>';
            DECLARE @StartField VARCHAR(100);
            SET @StartField = '<';
            DECLARE @EndField VARCHAR(100);
            SET @EndField = '>';
            SET @RowStart = CHARINDEX(@StartRoot, @XMLString, 0);
            SET @JSON = '';
            WHILE @RowStart>0
            BEGIN
                SET @RowStart = @RowStart + LEN(@StartRoot);
                SET @RowEnd = CHARINDEX(@EndRoot, @XMLString, @RowStart);
                SET @Row = SUBSTRING(@XMLString, @RowStart, @RowEnd - @RowStart);
                SET @JSON = @JSON + '{';
                --//for each row
                SET @FieldStart = CHARINDEX(@StartField, @Row, 0);
                WHILE @FieldStart>0
                BEGIN
                    --//parse node key
                    SET @FieldStart = @FieldStart + LEN(@StartField);
                    SET @FieldEnd = CHARINDEX(@EndField, @Row, @FieldStart);
                    DECLARE @end INT = CHARINDEX('/>', @Row, @FieldStart);
                    IF @end<1
                        OR @end>@FieldEnd
                    BEGIN
                        SET @KEY = SUBSTRING(@Row, @FieldStart, @FieldEnd - @FieldStart);
                        SET @JSON = @JSON + '"' + @KEY + '":';
                        --//parse node value
                        SET @FieldStart = @FieldEnd + 1;
                        SET @FieldEnd = CHARINDEX('</', @Row, @FieldStart);
                        SET @Value = SUBSTRING(@Row, @FieldStart, @FieldEnd - @FieldStart);
                        SET @JSON = @JSON + '"' + @Value + '",';
                    END;
                    SET @FieldStart = @FieldStart + LEN(@StartField);
                    SET @FieldEnd = CHARINDEX(@EndField, @Row, @FieldStart);
                    SET @FieldStart = CHARINDEX(@StartField, @Row, @FieldEnd);
                END;
                IF LEN(@JSON)>0
                    SET @JSON = SUBSTRING(@JSON, 0, LEN(@JSON));
                SET @JSON = @JSON + '},';
                --// for each row
                SET @RowStart = CHARINDEX(@StartRoot, @XMLString, @RowEnd);
            END;
            IF LEN(@JSON)>0
                SET @JSON = SUBSTRING(@JSON, 0, LEN(@JSON));
            --//SET @JSON = '[' + @JSON + ']';
            SET @json_xml = @JSON;
        END TRY--//结束捕捉异常
        BEGIN CATCH--//有异常被捕获
            SET @json_xml = @XMLString;
        END CATCH;--//结束异常处理
    END;
    
  • 相关阅读:
    android 模拟器手机如何添加文件到sd卡?
    Asp.Net 前台和后台交互的一些问题
    Cannot get WiFi AP state 错误
    MediaPlayer.getCurrentPosition IllegalStateException错误
    SQL Compare 错误 给定关键字不在字典中
    java.net.SocketException: Connection timed out的一种情况
    System services not available to Activities before onCreate()
    java.net.SocketException: Connection reset by peer
    卸载Microsoft Virtual WiFi Miniport Adapter 方法
    java 跳出 if
  • 原文地址:https://www.cnblogs.com/ArtlessBruin/p/7126573.html
Copyright © 2020-2023  润新知