我正在将JSON作为参数传递给SQL存储过程。我使用一个接受JSON字典并创建键值对表格(两列)的函数,然后与
。我需要的是这样的表变量:
。我可以使用第一个表中的列名来获取列名。
但是字典的值与键不对应。以下是Umair当前回答的结果:
COALESCE
一起使用该表格来创建动态SQL用于INSERT
语句。这对于单个字典有效,但我还需要能够发送包含字典数组的JSON字符串。现在,我的解析函数会给我这个表变量:SELECT DISTINCT element name from @JSONTable
我需要提醒的是,这些元素名称可能会改变。我不知道有多少不同的元素名称值。
更新 - 使用Umair的回答,我已经接近成功:
DECLARE @JSONString AS VARCHAR(MAX)
SET @JSONString = '[{"ravid":3,"ravversion":2,"taskid":3},{"ravid":4,"ravversion":7,"taskid":99}]'
IF OBJECT_ID('tempdb..#JSONTable') IS NOT NULL
DROP TABLE #JSONTable
CREATE TABLE #JSONTable
(
elementname VARCHAR(500) ,
elementvalue VARCHAR(500)
)
INSERT INTO #JSONTable
( elementname ,
elementvalue
)
SELECT NAME ,
StringValue
FROM dbo.parseJSON(@JSONString)
WHERE LEN(StringValue) > 0 AND NAME IS NOT NULL
--declare a csv variable with all the distinct elements
DECLARE @csv NVARCHAR(max) = STUFF(
(
SELECT ',' + elementname
FROM (
SELECT DISTINCT elementname
FROM #JSONTable
) AS e
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'),
1,
1,
''
);
DECLARE @sql NVARCHAR(MAX) = '
SELECT *
FROM (
SELECT *, Row = ROW_NUMBER() OVER (PARTITION BY elementname ORDER BY elementname)
FROM #JSONTable
) AS t
PIVOT (
MAX(elementvalue)
FOR elementname IN (' + @csv + ')
) AS p
'
EXEC sp_executesql @sql
但是字典的值与键不对应。以下是Umair当前回答的结果:
![enter image description here](https://istack.dev59.com/FCTrL.webp)
[{property1:'value1',property2:'value2'},{'property3':'value3'}]
和[{property1:'value1'},{'property2':'value2',property3:'value3'}]
将在您的函数中产生相同的输出。那么,您如何区分每个键属于哪个对象?唯一的方法是在函数中添加一个新列。它指示键属于哪个对象。 - Umair