--- title: "JSON_VALUE (Transact-SQL)" description: JSON_VALUE extracts a scalar value from a JSON string. author: WilliamDAssafMSFT ms.author: wiassaf ms.reviewer: jovanpop ms.date: 11/04/2024 ms.service: sql ms.subservice: t-sql ms.topic: reference ms.custom: - build-2024 - ignite-2024 f1_keywords: - "JSON_VALUE" - "JSON_VALUE_TSQL" helpviewer_keywords: - "JSON_VALUE function" - "JSON, extracting" - "JSON, querying" dev_langs: - "TSQL" monikerRange: "=azuresqldb-current || =azure-sqldw-latest || >=sql-server-2016 || >=sql-server-linux-2017 || =azuresqldb-mi-current || =fabric" --- # JSON_VALUE (Transact-SQL) [!INCLUDE [sqlserver2016-asdb-asdbmi-asa-fabricse-fabricdw](../../includes/applies-to-version/sqlserver2016-asdb-asdbmi-asa-fabricse-fabricdw.md)] Extracts a scalar value from a JSON string. To extract an object or an array from a JSON string instead of a scalar value, see [JSON_QUERY (Transact-SQL)](json-query-transact-sql.md). For info about the differences between `JSON_VALUE` and `JSON_QUERY`, see [Compare JSON_VALUE and JSON_QUERY](../../relational-databases/json/validate-query-and-change-json-data-with-built-in-functions-sql-server.md#JSONCompare). :::image type="icon" source="../../includes/media/topic-link-icon.svg" border="false"::: [Transact-SQL syntax conventions](../../t-sql/language-elements/transact-sql-syntax-conventions-transact-sql.md) ## Syntax ```syntaxsql JSON_VALUE ( expression , path ) ``` ## Arguments #### *expression* An expression. Typically the name of a variable or a column that contains JSON text. If `JSON_VALUE` finds JSON that is not valid in *expression* before it finds the value identified by *path*, the function returns an error. If `JSON_VALUE` doesn't find the value identified by *path*, it scans the entire text and returns an error if it finds JSON that is not valid anywhere in *expression*. #### *path* A JSON path that specifies the property to extract. For more info, see [JSON Path Expressions (SQL Server)](../../relational-databases/json/json-path-expressions-sql-server.md). In [!INCLUDE [sssql17-md](../../includes/sssql17-md.md)] and in [!INCLUDE [ssazure-sqldb](../../includes/ssazure-sqldb.md)], you can provide a variable as the value of *path*. If the format of *path* isn't valid, `JSON_VALUE` returns an error. ## Return value Returns a single text value of type nvarchar(4000). The collation of the returned value is the same as the collation of the input expression. If the value is greater than 4000 characters: - In lax mode, `JSON_VALUE` returns `NULL`. - In strict mode, `JSON_VALUE` returns an error. If you have to return scalar values greater than 4000 characters, use `OPENJSON` instead of `JSON_VALUE`. For more info, see [OPENJSON (Transact-SQL)](openjson-transact-sql.md). JSON functions work the same whether the JSON document is stored in **varchar**, **nvarchar**, or the native **json** data type. ## Remarks ### Lax mode and strict mode Consider the following JSON text: ```json DECLARE @jsonInfo NVARCHAR(MAX) SET @jsonInfo=N'{ "info":{ "type":1, "address":{ "town":"Bristol", "county":"Avon", "country":"England" }, "tags":["Sport", "Water polo"] }, "type":"Basic" }' ``` The following table compares the behavior of `JSON_VALUE` in lax mode and in strict mode. For more info about the optional path mode specification (lax or strict), see [JSON Path Expressions (SQL Server)](../../relational-databases/json/json-path-expressions-sql-server.md). |Path|Return value in lax mode|Return value in strict mode|More info| |----------|------------------------------|---------------------------------|---------------| |$|`NULL`|Error|Not a scalar value.

Use `JSON_QUERY` instead.| |$.info.type|N'1'|N'1'|N/a| |$.info.address.town|N'Bristol'|N'Bristol'|N/a| |$.info."address"|`NULL`|Error|Not a scalar value.

Use `JSON_QUERY` instead.| |$.info.tags|`NULL`|Error|Not a scalar value.

Use `JSON_QUERY` instead.| |$.info.type[0]|`NULL`|Error|Not an array.| |$.info.none|`NULL`|Error|Property does not exist.| ## Examples ### Example 1 The following example uses the values of the JSON properties `town` and `state` in query results. Since `JSON_VALUE` preserves the collation of the source, the sort order of the results depends on the collation of the `jsonInfo` column. > [!NOTE] > (This example assumes that a table named `Person.Person` contains a `jsonInfo` column of JSON text, and that this column has the structure shown previously in the discussion of lax mode and strict mode. In the `AdventureWorks` sample database, the `Person` table does not in fact contain a `jsonInfo` column.) ```sql 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') ``` ### Example 2 The following example extracts the value of the JSON property `town` into a local variable. ```sql DECLARE @jsonInfo NVARCHAR(MAX) DECLARE @town 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 ``` ### Example 3 The following example creates computed columns based on the values of JSON properties. ```sql 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') ) ``` ## Related content - [JSON Path Expressions (SQL Server)](../../relational-databases/json/json-path-expressions-sql-server.md) - [JSON data in SQL Server](../../relational-databases/json/json-data-sql-server.md)