[英]Pivot TSQL table with dynamic columns
我將JSON作為參數傳遞給SQL存儲過程。 我使用一個使用JSON字典並創建具有鍵值對(兩列)的表的函數,然后將其與COALESCE
一起用於為INSERT
語句創建動態sql。 這對於單個字典來說效果很好,但是我還需要能夠發送包含字典數組的JSON字符串。 現在,我的解析函數給了我這個表變量:
我需要的是一個這樣的表變量:
我可以從第一個表中獲取列名稱:
SELECT DISTINCT element name from @JSONTable
我應該提到,這些elementname可以並且將會改變。 我將不知道不同的elementname值的數量。
更新-使用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當前答案的結果:
怎么樣
--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 elementvalue)
FROM #JSONTable
) AS t
PIVOT (
MAX(elementvalue)
FOR elementname IN (' + @csv + ')
) AS p
'
EXEC sp_executesql @sql
即動態樞軸:)
編輯:
由於您不希望通過數據透視表中的任何內容進行聚合,因此我添加了一個行號功能,為每個不同的elementname分配一個按順序遞增的id(基於element值)。 這實際上將按此行列將數據透視表分組,從而生成所有必需的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.