<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      T-SQL——自定義函數解析JSON字符串

      T-SQL——自定義函數解析JSON字符串

      • 適應于是2005及以上版本

      1. 函數創建腳本

      CREATE FUNCTION [dbo].[parseJSON]( @JSON NVARCHAR(MAX))
      /**
      Summary: >
        The code for the JSON Parser/Shredder will run in SQL Server 2005, 
        and even in SQL Server 2000 (with some modifications required).
       
        First the function replaces all strings with tokens of the form @Stringxx,
        where xx is the foreign key of the table variable where the strings are held.
        This takes them, and their potentially difficult embedded brackets, out of 
        the way. Names are  always strings in JSON as well as  string values.
       
        Then, the routine iteratively finds the next structure that has no structure 
        Contained within it, (and is, by definition the leaf structure), and parses it,
        replacing it with an object token of the form ‘@Objectxxx‘, or ‘@arrayxxx‘, 
        where xxx is the object id assigned to it. The values, or name/value pairs 
        are retrieved from the string table and stored in the hierarchy table. G
        radually, the JSON document is eaten until there is just a single root
        object left.
      Author: PhilFactor
      Date: 01/07/2010
      Version: 
        Number: 4.6.2
        Date: 01/07/2019
        Why: case-insensitive version
      Example: >
        Select * from parseJSON('{    "Person": 
            {
             "firstName": "John",
             "lastName": "Smith",
             "age": 25,
             "Address": 
                 {
                "streetAddress":"21 2nd Street",
                "city":"New York",
                "state":"NY",
                "postalCode":"10021"
                 },
             "PhoneNumbers": 
                 {
                 "home":"212 555-1234",
                "fax":"646 555-4567"
                 }
              }
           }
        ')
      Returns: >
        nothing
      **/
      	RETURNS @hierarchy TABLE
      	  (
      	   Element_ID INT IDENTITY(1, 1) NOT NULL, /* internal surrogate primary key gives the order of parsing and the list order */
      	   SequenceNo [INT] NULL, /* the place in the sequence for the element */
      	   Parent_ID INT NULL, /* 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 NULL, /* each list or object has an object id. This ties all elements to a parent. Lists are treated as objects here */
      	   Name NVARCHAR(2000) NULL, /* the Name of the object */
      	   StringValue NVARCHAR(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
      	    @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
      	    @SequenceNo int, -- the sequence number within a list
      	    @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',
      	    @SequenceNo=0, --set the sequence no. to something sensible.
      	  /* 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 collate SQL_Latin1_General_CP850_Bin);--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) COLLATE SQL_Latin1_General_CP850_Bin);
      	        END
      	      IF @end=0 --either the end or no end delimiter to last string
      	        BEGIN-- check if ending with a double slash...
                   SET @end=PATINDEX('%[\][\]["]%', RIGHT(@json, LEN(@json+'|')-@start) collate SQL_Latin1_General_CP850_Bin);
       		     IF @end=0 --we really have reached the end 
      				BEGIN
      				BREAK --assume all tokens found
      				END
      			END 
      	      SELECT @token=SUBSTRING(@json, @start+1, @end-1)
      	      --now put in the escaped control characters
      	      SELECT @token=REPLACE(@token, FromString, ToString)
      	      FROM
      	        (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)
      			 UNION ALL SELECT '\"', '"'
      	         UNION ALL SELECT '\/', '/'
      	        ) substitutions(FromString, ToString)
      		SELECT @token=Replace(@token, '\\', '\')
      	      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 collate SQL_Latin1_General_CP850_Bin)
      	          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(NCHAR(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 collate SQL_Latin1_General_CP850_Bin)--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)collate SQL_Latin1_General_CP850_Bin)--object
      	      IF @NextOpenDelimiter=0 
      	        BREAK
      	      SELECT @NextOpenDelimiter=@NextOpenDelimiter+@OpenDelimiter
      	      IF @NextCloseDelimiter<@NextOpenDelimiter 
      	        BREAK
      	      IF SUBSTRING(@json, @NextOpenDelimiter, 1)='{' 
      	        SELECT @NextCloseDelimiterChar='}', @type='object'
      	      ELSE 
      	        SELECT @NextCloseDelimiterChar=']', @type='array'
      	      SELECT @OpenDelimiter=@NextOpenDelimiter
      	    END
      	  ---and parse out the list or Name/value pairs
      	  SELECT
      	    @contents=SUBSTRING(@json, @OpenDelimiter+1,
      	                        @NextCloseDelimiter-@OpenDelimiter-1)
      	  SELECT
      	    @JSON=STUFF(@json, @OpenDelimiter,
      	                @NextCloseDelimiter-@OpenDelimiter+1,
      	                '@'+@type+CONVERT(NCHAR(5), @Parent_ID))
      	  WHILE (PATINDEX('%[A-Za-z0-9@+.e]%', @contents COLLATE SQL_Latin1_General_CP850_Bin))<>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
      	            @SequenceNo=0,@end=CHARINDEX(':', ' '+@contents)--if there is anything, it will be a string-based Name.
      	          SELECT  @start=PATINDEX('%[^A-Za-z@][@]%', ' '+@contents collate SQL_Latin1_General_CP850_Bin)--AAAAAAAA
                    SELECT @token=RTrim(Substring(' '+@contents, @start+1, @End-@Start-1)),
      	            @endofName=PATINDEX('%[0-9]%', @token collate SQL_Latin1_General_CP850_Bin),
      	            @param=RIGHT(@token, LEN(@token)-@endofName+1)
      	          SELECT
      	            @token=LEFT(@token, @endofName-1),
      	            @Contents=RIGHT(' '+@contents, LEN(' '+@contents+'|')-@end-1)
      	          SELECT  @Name=StringValue FROM @strings
      	            WHERE string_id=@param --fetch the Name
      	        END
      	      ELSE 
      	        SELECT @Name=NULL,@SequenceNo=@SequenceNo+1 
      	      SELECT
      	        @end=CHARINDEX(',', @contents)-- a string-token, object-token, list-token, number,boolean, or null
                      IF @end=0
      	        --HR Engineering notation bugfix start
      	          IF ISNUMERIC(@contents) = 1
      		    SELECT @end = LEN(@contents) + 1
      	          ELSE
      	        --HR Engineering notation bugfix end 
      		  SELECT  @end=PATINDEX('%[A-Za-z0-9@+.e][^A-Za-z0-9@+.e]%', @contents+' ' COLLATE SQL_Latin1_General_CP850_Bin) + 1
      	       SELECT
      	        @start=PATINDEX('%[^A-Za-z0-9@+.e][A-Za-z0-9@+.e]%', ' '+@contents collate SQL_Latin1_General_CP850_Bin)
      	      --select @start,@end, LEN(@contents+'|'), @contents  
      	      SELECT
      	        @Value=RTRIM(SUBSTRING(@contents, @start, @End-@Start)),
      	        @Contents=RIGHT(@contents+' ', LEN(@contents+'|')-@end)
      	      IF SUBSTRING(@value, 1, 7)='@object' 
      	        INSERT INTO @hierarchy
      	          (Name, SequenceNo, Parent_ID, StringValue, Object_ID, ValueType)
      	          SELECT @Name, @SequenceNo, @Parent_ID, SUBSTRING(@value, 8, 5),
      	            SUBSTRING(@value, 8, 5), 'object' 
      	      ELSE 
      	        IF SUBSTRING(@value, 1, 6)='@array' 
      	          INSERT INTO @hierarchy
      	            (Name, SequenceNo, Parent_ID, StringValue, Object_ID, ValueType)
      	            SELECT @Name, @SequenceNo, @Parent_ID, SUBSTRING(@value, 7, 5),
      	              SUBSTRING(@value, 7, 5), 'array' 
      	        ELSE 
      	          IF SUBSTRING(@value, 1, 7)='@string' 
      	            INSERT INTO @hierarchy
      	              (Name, SequenceNo, Parent_ID, StringValue, ValueType)
      	              SELECT @Name, @SequenceNo, @Parent_ID, StringValue, 'string'
      	              FROM @strings
      	              WHERE string_id=SUBSTRING(@value, 8, 5)
      	          ELSE 
      	            IF @value IN ('true', 'false') 
      	              INSERT INTO @hierarchy
      	                (Name, SequenceNo, Parent_ID, StringValue, ValueType)
      	                SELECT @Name, @SequenceNo, @Parent_ID, @value, 'boolean'
      	            ELSE
      	              IF @value='null' 
      	                INSERT INTO @hierarchy
      	                  (Name, SequenceNo, Parent_ID, StringValue, ValueType)
      	                  SELECT @Name, @SequenceNo, @Parent_ID, @value, 'null'
      	              ELSE
      	                IF PATINDEX('%[^0-9]%', @value COLLATE SQL_Latin1_General_CP850_Bin)>0 
      	                  INSERT INTO @hierarchy
      	                    (Name, SequenceNo, Parent_ID, StringValue, ValueType)
      	                    SELECT @Name, @SequenceNo, @Parent_ID, @value, 'real'
      	                ELSE
      	                  INSERT INTO @hierarchy
      	                    (Name, SequenceNo, Parent_ID, StringValue, ValueType)
      	                    SELECT @Name, @SequenceNo, @Parent_ID, @value, 'int'
      	      IF @Contents=' ' SELECT @SequenceNo=0
      	    END
      	  END
      	INSERT INTO @hierarchy (Name, SequenceNo, Parent_ID, StringValue, Object_ID, ValueType)
      	  SELECT '-',1, NULL, '', @Parent_ID-1, @type
      	--
      	   RETURN
      	END
      
      GO
      
      

      2. 測試效果

        Select * from parseJSON('{    "Person": 
            {
             "firstName": "John",
             "lastName": "Smith",
             "age": 25,
             "Address": 
                 {
                "streetAddress":"21 2nd Street",
                "city":"New York",
                "state":"NY",
                "postalCode":"10021"
                 },
             "PhoneNumbers": 
                 {
                 "home":"212 555-1234",
                "fax":"646 555-4567"
                 }
              }
           }
        ')
      

      結果:

      
      Element_ID  SequenceNo  Parent_ID   Object_ID   Name             
      ----------- ----------- ----------- ----------- -----------------
      1           0           1           NULL        streetAddress    
      2           0           1           NULL        city             
      3           0           1           NULL        state            
      4           0           1           NULL        postalCode       
      5           0           2           NULL        home             
      6           0           2           NULL        fax              
      7           0           3           NULL        firstName        
      8           0           3           NULL        lastName         
      9           0           3           NULL        age              
      10          0           3           1           Address          
      11          0           3           2           PhoneNumbers     
      12          0           4           3           Person           
      13          1           NULL        4           -                
      
      posted @ 2024-11-13 08:46  shanzm  閱讀(50)  評論(0)    收藏  舉報
      TOP
      主站蜘蛛池模板: 香港日本三级亚洲三级| 97一期涩涩97片久久久久久久| 国精偷拍一区二区三区| 国产精品免费无遮挡无码永久视频| 亚洲午夜久久久久久噜噜噜| 91老肥熟女九色老女人| 精品无码黑人又粗又大又长 | 国产极品美女高潮无套| 中文字幕 日韩 人妻 无码| 久久精品国产国产精品四凭| 最新永久免费AV无码网站| 日韩少妇人妻vs中文字幕| 色国产视频| 欧美一区二区三区啪啪| 成人亚洲av免费在线| 久久精品国产精品第一区| 久久精品国产再热青青青| 嘉峪关市| 日韩中文字幕免费在线观看| 国产成人AV大片大片在线播放| 国产色无码专区在线观看| 精品综合久久久久久97| 狠狠色噜噜狠狠亚洲AV| 中文字幕日韩有码国产| 色综合天天综合天天综| 欧美不卡无线在线一二三区观| 亚洲av无码精品色午夜蛋壳| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 亚洲熟妇av综合一区二区| 国产成人精品18| 成人免费无码大片a毛片| 国产另类ts人妖一区二区| 亚洲国产成人精品无码区在线观看| 里番全彩爆乳女教师| 人妻少妇精品视频专区| 中文字幕丰满乱子无码视频| 亚洲国产综合av在线观看| 国产av不卡一区二区| 久久er99热精品一区二区| 伦伦影院午夜理论片| 忘忧草影视|