比较SQL Server 2016中使用openjson的JSON字符串
我有两种插入json字符串的场景。 我使用下面的代码检查json字符串是否已经存在,然后插入到表中比较SQL Server 2016中使用openjson的JSON字符串,sql,json,sql-server,sql-server-2016,Sql,Json,Sql Server,Sql Server 2016,我有两种插入json字符串的场景。 我使用下面的代码检查json字符串是否已经存在,然后插入到表中 **Scenario - 1** declare @jsonStr nvarchar(max) = {"Manufacurer": "test", "Model": "A", "Color":"New Color","Thickness":"1 mm"} declare @SqlStr nvarchar(max), @counts int Select @d
**Scenario - 1**
declare @jsonStr nvarchar(max) = {"Manufacurer": "test", "Model": "A", "Color":"New Color","Thickness":"1 mm"}
declare @SqlStr nvarchar(max), @counts int
Select @dynamicFilter = Coalesce(@dynamicFilter,'') +' and Json_Value(ItemOfProduct,''$."'+ [key] +'"'') = ''' +[value]+'''' from openjson(jsonStr)
set @SqlStr = 'select @cnt = count(*) from tblTest where '+@dynamicFilter
Exec sp_executesql @SqlStr, N'@cnt int output', @cnt = @counts output
if(@counts < 1)
Begin
//insert the data into the table
End
**Scenario - 2**
set @jsonStr = {"Manufacurer": "test", "Model": "A", "Color":"New Color"}
//Do the same above process of inserting
在第二种情况下,由于计数为1,我的数据不会被插入表中。但我希望场景1和场景2中的字符串都被视为不同的字符串,并且两个数据都被插入到数据库中 我认为最好的解决方案实际上是使用JSON_查询而不是JSON_值,因为您的键可能是动态的。一旦切换到JSON_查询,就不再需要执行动态SQL
CREATE TABLE #tblTest
(
id INT IDENTITY(1, 1)
,ItemOfProduct NVARCHAR(MAX)
);
/*Scenario 1*/
DECLARE @jsonStr NVARCHAR(MAX) = N'{"Manufacturer": "test", "Model": "A", "Color":"New Color","Thickness":"1 mm"}';
DECLARE @counts INT;
SELECT @counts = COUNT(*)
FROM #tblTest
WHERE JSON_QUERY(ItemOfProduct, '$') = JSON_QUERY(@jsonStr, '$');
IF(@counts < 1)
BEGIN
INSERT INTO #tblTest(ItemOfProduct)
VALUES(@jsonStr);
END;
/*Scenario 2*/
SET @jsonStr =
N'{"Manufacturer": "test", "Model": "A", "Color":"New Color"}';
SELECT @counts = COUNT(*)
FROM #tblTest
WHERE JSON_QUERY(ItemOfProduct, '$') = JSON_QUERY(@jsonStr, '$');
IF(@counts < 1)
BEGIN
INSERT INTO #tblTest(ItemOfProduct)
VALUES(@jsonStr);
END;
SELECT *
FROM #tblTest;
我认为最好的解决方案实际上是使用JSON_查询而不是JSON_值,因为您的键可能是动态的。一旦切换到JSON_查询,就不再需要执行动态SQL
CREATE TABLE #tblTest
(
id INT IDENTITY(1, 1)
,ItemOfProduct NVARCHAR(MAX)
);
/*Scenario 1*/
DECLARE @jsonStr NVARCHAR(MAX) = N'{"Manufacturer": "test", "Model": "A", "Color":"New Color","Thickness":"1 mm"}';
DECLARE @counts INT;
SELECT @counts = COUNT(*)
FROM #tblTest
WHERE JSON_QUERY(ItemOfProduct, '$') = JSON_QUERY(@jsonStr, '$');
IF(@counts < 1)
BEGIN
INSERT INTO #tblTest(ItemOfProduct)
VALUES(@jsonStr);
END;
/*Scenario 2*/
SET @jsonStr =
N'{"Manufacturer": "test", "Model": "A", "Color":"New Color"}';
SELECT @counts = COUNT(*)
FROM #tblTest
WHERE JSON_QUERY(ItemOfProduct, '$') = JSON_QUERY(@jsonStr, '$');
IF(@counts < 1)
BEGIN
INSERT INTO #tblTest(ItemOfProduct)
VALUES(@jsonStr);
END;
SELECT *
FROM #tblTest;
tblTest的结构是什么?桌子上有什么限制吗?您实际使用什么代码尝试将记录插入表中?您的代码似乎缺少帮助您调试它所需的一部分。tblTest的结构是什么?桌子上有什么限制吗?您实际使用什么代码尝试将记录插入表中?您的代码似乎缺少帮助您调试它所需的部分。