JSON_VALUE(Transact-SQL)

적용 대상:Microsoft Fabric의 MicrosoftFabric SQL Database에 있는 Microsoft Fabric Warehouse의 SQL Server 2016(13.x) 이상 버전 Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL 분석 엔드포인트

JSON_VALUE 구문을 사용하여 JSON 문자열에서 스칼라 값을 추출합니다.

스칼라 값 대신 JSON 문자열에서 개체 또는 배열을 추출하려면 JSON_QUERY 참조하세요. JSON_VALUE와(과) JSON_QUERY의 차이점에 대한 정보는, JSON_VALUE 및 JSON_QUERY 비교를 참조하세요.

Transact-SQL 구문 표기 규칙

Syntax

SQL Server 2022(16.x) 및 이전 버전의 구문입니다.

JSON_VALUE ( expression , path )

SQL Server 2025(17.x) 이상 버전에 대한 구문입니다.

JSON_VALUE ( expression , path [ RETURNING data_type ] )

Note

SQL Server 2022(16.x) 및 이전 버전에서는 RETURNING이 포함되지 않습니다.

Arguments

expression

일반적으로 JSON 텍스트를 포함하는 변수 또는 열의 이름인 식입니다.

JSON_VALUE로 식별된 값을 찾기 전에 식에서 유효하지 않은 JSON을 찾으면 함수는 오류를 반환합니다. JSON_VALUE 경로로 식별된 값을 찾지 못하면 전체 텍스트를 검색하고 식에서 유효하지 않은 JSON을 찾으면 오류를 반환합니다.

path

A JSON 추출할 속성을 지정하는 경로입니다. 자세한 내용은 SQL Database 엔진의 JSON 경로 식을 참조하세요.

SQL Server 2017(14.x) 및 Azure SQL Database에서 변수를 경로 값으로 제공할 수 있습니다.

경로 형식이 유효 JSON_VALUE 하지 않으면 오류를 반환합니다.

data_type

반환 값에 사용할 데이터 형식입니다. 이 형식은 입력이 JSON 형식인 경우에만 지원됩니다. 지원되는 데이터 형식은 tinyint, smallint, int, bigint, decimal, numeric, float, real, char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), date, time, datetime2 및 datetimeoffset입니다.

반환 값

적용 대상: SQL Server 2025 (17.x) 및 이후 버전.

포함하지 RETURNING않는 경우:

  • nvarchar(4000) 형식의 단일 텍스트 값을 반환합니다. 반환된 값의 데이터 정렬은 입력 식의 데이터 정렬과 일치합니다.

  • 값이 4,000자보다 큰 경우:

    • lax 모드에서는 JSON_VALUE이(가) NULL를 반환합니다.
    • strict 모드에서는 JSON_VALUE이(가) 오류를 반환합니다.

    4,000자보다 큰 스칼라 값을 반환해야 하는 경우 대신 사용합니다 OPENJSONJSON_VALUE. 자세한 내용은 OPENJSON을 참조하세요.

다음을 포함하는 RETURNING경우:

data_type 지정된 값을 반환합니다. 지원되는 데이터 형식은 tinyint, smallint, int, bigint, decimal, numeric, float, real, char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), date, time, datetime2 및 datetimeoffset입니다.

JSON 함수는 JSON 문서가 varchar, nvarchar 또는 네이티브 json 데이터 형식에 저장되는지와 동일한 방식으로 작동합니다.

Remarks

lax 모드와 strict 모드

다음 JSON 텍스트를 살펴보십시오.

DECLARE @jsonInfo AS NVARCHAR (MAX);

SET @jsonInfo = N'{
     "info":{
       "type":1,
       "address":{
         "town":"Bristol",
         "county":"Avon",
         "country/region":"England"
       },
       "tags":["Sport", "Water polo"]
    },
    "type":"Basic"
 }';

다음 표에서는 lax 모드 및 strict 모드에서 JSON_VALUE의 동작을 비교합니다. 선택적 경로 모드 사양(lax 또는 strict)에 대한 자세한 내용은 SQL Database 엔진의 JSON 경로 식을 참조하세요.

Path lax 모드에서 값을 반환합니다. strict 모드에서 값을 반환합니다. 추가 정보
$ NULL Error 스칼라 값이 아닙니다.

대신 JSON_QUERY를 사용하세요.
$.info.type N'1' N'1' N/a
$.info.address.town N'Bristol' N'Bristol' N/a
$.info."address" NULL Error 스칼라 값이 아닙니다.

대신 JSON_QUERY를 사용하세요.
$.info.tags NULL Error 스칼라 값이 아닙니다.

대신 JSON_QUERY를 사용하세요.
$.info.type[0] NULL Error 배열이 아닙니다.
$.info.none NULL Error 속성이 없습니다.

Examples

예제 1

다음 예에서는 쿼리 결과에서 JSON 속성 town 및 state의 값을 사용합니다. JSON_VALUE은(는) 원본의 데이터 정렬을 유지하므로 결과의 정렬 순서는 jsonInfo 열의 데이터 정렬에 따라 다릅니다.

Note

이 예제에서는 이름이 지정된 Person.Person 테이블에 JSON 텍스트 열이 포함되어 jsonInfo 있고 이 열에 이전에 lax 모드 및 strict 모드에 대해 설명한 구조가 있다고 가정합니다. AdventureWorks 샘플 데이터베이스에서 Person 테이블에는 열이 jsonInfo 없습니다.

SELECT FirstName,
       LastName,
       JSON_VALUE(jsonInfo, '$.info.address.town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo, '$.info.address.state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo, '$.info.address.town');

예제 2

다음 예에서는 JSON 속성 town의 값을 로컬 변수로 추출합니다.

DECLARE @jsonInfo AS NVARCHAR (MAX);
DECLARE @town AS NVARCHAR (32);

SET @jsonInfo = N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[0].town'); -- Paris
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[1].town'); -- London

예제 3

다음 예에서는 JSON 속성 값을 기반으로 계산된 열을 만듭니다.

CREATE TABLE dbo.Store
(
    StoreID INT IDENTITY (1, 1) NOT NULL,
    Address VARCHAR (500),
    jsonContent NVARCHAR (4000),
    Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
    Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
);

예제 4

다음 예제에서는 값을 사용하여 JSON_VALUE JSON 배열에서 값을 추출하고 값을 날짜 형식 값으로 반환합니다.

DECLARE @j AS JSON = '[1, 1.3333, true, "a", "1", "2025-01-01"]';

SELECT JSON_VALUE(@j, '$[5]' RETURNING date) AS date_value;
date_value
--------
2025-01-01