This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DROP TABLE IF EXISTS dbo.XmlVsJSON2 | |
CREATE TABLE dbo.XmlVsJson2 | |
( | |
Id INT IDENTITY PRIMARY KEY, | |
XmlData XML, | |
JsonData NVARCHAR(MAX) | |
) | |
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
USE Sandbox; | |
DROP TABLE IF EXISTS dbo.XmlVsJSON | |
CREATE TABLE dbo.XmlVsJson | |
( | |
Id INT IDENTITY PRIMARY KEY, | |
XmlData XML, | |
JsonData NVARCHAR(MAX) | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DECLARE @sqlDate datetime2 = '2017-03-28 12:45:00.1234567' | |
DECLARE @jsonData nvarchar(max) = N'{ "createDate" : "2017-03-28T12:45:00.000Z" }' | |
,@newDate datetime2(3) = '2017-03-28T12:48:00.123Z' | |
-- Let's start out modifying our data by replacing the value completely | |
SELECT JSON_VALUE(@jsonData, '$.createDate') |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DECLARE @sqlData datetime2 = '2017-03-28 12:45:00.1234567' | |
-- Let's first try the simplest SQL to JSON conversion first using FOR JSON PATH | |
SELECT @sqlData as SQLDateTime2 FOR JSON PATH | |
-- Output: [{"SQLDateTime2":"2017-03-28T12:45:00"}] | |
-- Honestly that's not too bad! | |
-- The datetime gets created in the YYYY-MM-DDTHH:MM:SS.fffffff format | |
-- Although this is pretty much what we need, what if we want to be explicit and specify that we are in UTC? | |
-- Just add the AT TIME ZONE modifier and we will get our JSON "Z" indicating UTC |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DECLARE @jsonData nvarchar(max) = N'{ "createDate" : "2017-03-28T12:45:00.000Z" }' | |
-- SQL's JSON_VALUE() will read in the JSON date time as a string | |
SELECT JSON_VALUE(@jsonData, '$.createDate') | |
-- Output: 2017-03-28T12:45:00Z | |
-- If we want to read it in as a SQL datetime2, we need to use a CONVERT() (or a CAST()) | |
SELECT CONVERT(datetime2, JSON_VALUE(@jsonData, '$.createDate')) | |
-- Output: 2017-03-28 12:45:00.0000000 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void Main(string[] args) | |
{ | |
string cars = @"[ {""year"":2001,""make"":""ACURA"",""model"":""CL""}, ... ]"; | |
Stopwatch stopwatch = new Stopwatch(); | |
// Test #1 | |
stopwatch.Start(); | |
var deserializedCars = JsonConvert.DeserializeObject<IEnumerable<Car>>(cars); | |
stopwatch.Stop(); | |
long elapsedMillisecondsDeserialize = stopwatch.ElapsedMilliseconds; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Turn on stats and see how long it takes to parse the ~20k JSON array elements | |
SET STATISTICS TIME ON | |
-- Test #1 | |
-- Test how long it takes to parse each property from all ~20k elements from the JSON array | |
-- SQL returns this query in ~546ms | |
SELECT JSON_VALUE(value, '$.year') AS [Year], JSON_VALUE(value, '$.make') AS Make, JSON_VALUE(value, '$.model') AS Model FROM OPENJSON(@cars, '$') | |
-- Test #2 | |
-- Time to deserialize and query just Golfs without computed column + index |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Indexed computed column returns results in ~1ms | |
SELECT * FROM dbo.Cars WHERE CarModel = 'Golf' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Let's compare how quick Phil Factor's JSON parsing function does against the new SQL 2016 functions | |
-- Phil's parseJSON function can be downloaded from https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/ | |
SELECT years.StringValue AS Year, makes.StringValue AS Make, models.StringValue AS Model FROM dbo.parseJSON(@cars) models | |
INNER JOIN dbo.parseJSON(@cars) years ON models.parent_ID = years.parent_ID | |
INNER JOIN dbo.parseJSON(@cars) makes ON models.parent_ID = makes.parent_ID | |
WHERE models.NAME = 'model' AND models.StringValue = 'Golf' AND years.NAME = 'year' AND makes.NAME = 'make' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Add an index onto our computed column | |
CREATE CLUSTERED INDEX CL_CarModel ON dbo.Cars (CarModel) | |
-- Check the execution plans again | |
SELECT DISTINCT * FROM dbo.Cars WHERE JSON_VALUE(CarDetails, '$.model') = 'Golf' | |
SELECT DISTINCT * FROM dbo.Cars WHERE CarModel = 'Golf' | |
-- We now get index seeks! |