sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2012 の JSON_VALUE?

    誰もまだ何も提供していないように見えるので、ここに私がこれまでに書いたコードがあります。多分それは私の靴の次の人を助けるでしょう.取得する値のタイプに応じて、別の関数を使用することにしました。特筆すべきは、date 関数は 1970 年からのミリ秒数である値を取得するためのものであり、decimal 関数には、値を引用するかどうかを指定するパラメーターがあることです。

    create function [dbo].[GetJsonDateValue](@Key varchar(100), @data nvarchar(max))
    returns datetime
    as
    begin
        declare @keyIdx int = charindex(@Key, @data)
        declare @valueIdx int = @keyIdx + len(@Key) + 2 -- +2 to account for characters between key and value
        declare @termIdx int = charindex(',', @data, @keyIdx)
    
        -- In case it's last item in an object
        if @termIdx = 0
        set @termIdx = charindex('}', @data, @keyIdx)
    
        declare @valueLength int = @termIdx - @valueIdx
        declare @secondsSince1970 bigint = cast(substring(@data, @valueIdx, @valueLength) as bigint) / 1000
    
        declare @retValue datetime = dateadd(s, @secondsSince1970, '19700101')
        return @retValue
    end
    GO
    
    CREATE function [dbo].[GetJsonDecimalValue](@Key varchar(100), @data nvarchar(max), @quoted bit)
    returns decimal(9,2)
    as
    begin
        declare @keyIdx int = charindex(@Key, @data)
        declare @valueIdx int = @keyIdx + len(@Key) + 2 -- +2 to account for characters between key and value
                + case when @quoted = 1 then 1 else 0 end -- +1 more for quote around value if present
        declare @termIdx int = charindex(case @quoted when 1 then '"' else ',' end, @data, @valueIdx)
    
        -- In case it's last item in an object and not quoted
        if @quoted = 0 and @termIdx = 0
        set @termIdx = charindex('}', @data, @keyIdx)
    
        declare @valueLength int = @termIdx - @valueIdx
    
        if @valueLength = 0
        return null
    
        declare @retValue decimal(9,2) = cast(substring(@data, @valueIdx, @valueLength) as decimal(9,2))
        return @retValue
    end
    GO
    
    CREATE function [dbo].[GetJsonStringValue](@Key varchar(100), @data nvarchar(max))
    returns varchar(max)
    as
    begin
        declare @keyIdx int = charindex(@Key, @data)
        declare @valueIdx int = @keyIdx + len(@Key) + 3 -- +3 to account for characters between key and value
        declare @termIdx int = charindex('"', @data, @valueIdx)
    
        declare @valueLength int = @termIdx - @valueIdx
        declare @retValue varchar(max) = substring(@data, @valueIdx, @valueLength)
        return @retValue
    end
    GO
    


    1. ログインとデータベース ユーザーを作成するためのストアド プロシージャを作成しようとしていますか?

    2. WHERE句で同じリストを2回使用するにはどうすればよいですか?

    3. MySQL再帰CTEテーブルが存在しません

    4. SQLで列名の名前を変更するにはどうすればよいですか?