could you review my first project on github please. The JSON_MODIFY function in SQL Server 2016 and 2019 does not allow creating paths dynamically, making it necessary to chain JSON_MODIFY executions. In this project I tried an easier way to create json objects using TSQL through functions as in the example:
https://github.com/dbacriativo/sqlserver-json-helpers
Sample:
DECLARE @INPUT NVARCHAR(MAX) = '{}'
SELECT dbo.[JSON_OBJECT](@INPUT, 'this.path.not.exist', '{"dir":"c:\\"}')
-- output {"this":{"path": {"not": {"exist": {"dir":"c:\\"}}}}}
CREATE FUNCTION [dbo].[JSON_OBJECT](@JSON NVARCHAR(MAX), @PATH NVARCHAR(255), @VALUE NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
-- VALIDATIONS
IF ISJSON(@VALUE) <= 0
BEGIN
RETURN 'O Parâmetro @VALUE precisa ser um objeto json válido';
END;
-- SETUP JSON
IF ISNULL(@JSON,'') = ''
BEGIN
SET @JSON = '{}';
END;
SET @PATH = REPLACE(@PATH, '$.', '');
-- IF PATH EXISTS AND IS PROPERTY
IF JSON_VALUE(@JSON, CONCAT('$.', @PATH)) IS NOT NULL
BEGIN
--RETURN 'PROPERTY'
SET @JSON = JSON_MODIFY(@JSON, CONCAT('$.', @PATH), JSON_QUERY(@VALUE))
END
ELSE
BEGIN
-- IF PATH EXISTS AND IS OBJECT OR ARRAY
IF JSON_QUERY(@JSON, CONCAT('$.', @PATH)) IS NOT NULL
BEGIN
--RETURN 'OBJECT OR ARRAY'
SET @JSON = JSON_MODIFY(@JSON, CONCAT('$.', @PATH), JSON_QUERY(@VALUE))
END
ELSE
BEGIN
--RETURN 'PATH NOT EXISTS'
-- PATH NOT EXTISTS NEED TO BUILD PATH
DECLARE @TBLPATH TABLE (ID int identity, NAME varchar(255));
DECLARE @LEVELS INT = LEN(@PATH) - LEN(REPLACE(@PATH, '.','')) + 1;
DECLARE @JSON2 NVARCHAR(MAX) = '';
DECLARE @NAME VARCHAR(255);
DECLARE @CURPATH VARCHAR(255) = '$';
DECLARE @ID int = 1;
-- SPLIT PATH INTO PIECES
INSERT INTO @TBLPATH
SELECT value FROM STRING_SPLIT(@PATH, '.')
-- LOOP ON EACH PIECE OF PATH
WHILE @ID <= @LEVELS
BEGIN
SELECT @NAME = NAME
FROM @TBLPATH
WHERE ID = @ID;
-- CREATE PATCH
IF JSON_QUERY(@JSON, @CURPATH) IS NULL
BEGIN
SET @JSON = JSON_MODIFY(@JSON, @CURPATH, JSON_QUERY(CONCAT('{"', @NAME, '": null}')));
END;
-- UPDATE CURRENT
SET @CURPATH = CONCAT(@CURPATH, '.', @NAME);
SET @ID = @ID + 1;
END;
-- UPDATE TREE
SET @JSON = JSON_MODIFY(@JSON, CONCAT('$.', @PATH), JSON_QUERY(@VALUE))
END;
END;
-- UPDATED JSON
RETURN @JSON;
END;