Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

JSON_VALUE dla SQL Server 2012?

Cóż, ponieważ wydaje się, że nikt jeszcze nie miał nic do zaoferowania, oto kod, który do tej pory napisałem. Może to pomoże kolejnej osobie w moich butach. Zdecydowałem się na osobne funkcje w zależności od typu pobieranej wartości. Na szczególną uwagę zasługuje to, że funkcja date służy do pobierania wartości, która jest liczbą milisekund od 1970 roku, a funkcja dziesiętna ma parametr określający, czy wartość jest cytowana, czy nie.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Anatomia zakleszczeń w SQL Server i najlepsze sposoby ich uniknięcia

  2. Jaki jest punkt początkowego katalogu w parametrach połączenia programu SQL Server?

  3. Pomijanie wierszy podczas importowania programu Excel do SQL za pomocą SSIS 2008

  4. dlaczego procedura SQLCLR miałaby działać wolniej niż ta sama strona klienta kodu?

  5. Nagłówki kolumn T-SQL Pivot/Unpivot(Transpose) potrzebne jako wiersze danych