[英]How to convert Table data to JSON value in SQL Server using column values as nodes?
嗨,我是SQL server
JSON
流程的新手。
這是我的桌子:
DECLARE @Example TABLE
(
ThirdPartyInterfaceData VARCHAR(10)
,ThirdPartyInterfaceName VARCHAR(10)
,Name VARCHAR(512)
,Value VARCHAR(800)
)
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSAuthID','MAMDQ1ODNJN2JMMZMWZD')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSAuthToken','YWU5NTlhNzgxYTA1OWY4NTFkMTM4NWY4ZjM5Y2Zl')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSFrom','Venue Metro')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSStatusMonitorURL','http://www.google.com')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSStatusMonitorURLMethod','POST')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSRestAPIVersion','v1')
我想以以下特定方式將表數據轉換為JSON值:
預期產量:
{
"ThirdPartyInterfaceData": {
"SMS":
{
"ThirdPartyInterfaceName": "PLIVO",
"SYSTEM_SMSAuthID": "MAMDQ1ODNJN2JMMZMWZD",
"SYSTEM_SMSAuthToken": "YWU5NTlhNzgxYTA1OWY4NTFkMTM4NWY4ZjM5Y2Zl",
"SYSTEM_SMSFrom": "Venue Metro",
"SYSTEM_SMSStatusMonitorURL": "http://www.google.com",
"SYSTEM_SMSStatusMonitorURLMethod": "POST",
"SYSTEM_SMSRestAPIVersion": "v1"
}
}
}
我使用FOR JSON AUTO
嘗試了一些操作,它提供了以下值:
電流輸出:
[
{
"ThirdPartyInterfaceData":"SMS",
"ThirdPartyInterfaceName":"PLIVO",
"Name":"SYSTEM_SMSAuthID",
"Value":"MAMDQ1ODNJN2JMMZMWZD"
},
{
"ThirdPartyInterfaceData":"SMS",
"ThirdPartyInterfaceName":"PLIVO",
"Name":"SYSTEM_SMSAuthToken",
"Value":"YWU5NTlhNzgxYTA1OWY4NTFkMTM4NWY4ZjM5Y2Zl"
},..
..."
}
]
但是我的要求是上述格式,可以嗎? 誰能幫我得到這個。
提前致謝。
我們可以使用動態SQL。 我要從@Example
表中刪除行,因此,如果要使用我的解決方案並且不從主表中刪除行,則必須創建其他表並插入所有值。 它應適用於ThirdPartyInterfaceData
和ThirdPartyInterfaceName
列中的多個不同值。 需要SQL Server 2016。
第一路(帶有WHILE
循環)
DECLARE @Example TABLE
(
ThirdPartyInterfaceData VARCHAR(10)
,ThirdPartyInterfaceName VARCHAR(10)
,Name VARCHAR(512)
,Value VARCHAR(800)
)
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSAuthID','MAMDQ1ODNJN2JMMZMWZD')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSAuthToken','YWU5NTlhNzgxYTA1OWY4NTFkMTM4NWY4ZjM5Y2Zl')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSFrom','Venue Metro')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSStatusMonitorURL','http://www.google.com')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSStatusMonitorURLMethod','POST')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSRestAPIVersion','v1')
DECLARE @sql NVARCHAR(MAX)
DECLARE @value VARCHAR(800)
DECLARE @name VARCHAR(512)
DECLARE @ThirdPartyInterfaceData VARCHAR(10)
DECLARE @ThirdPartyInterfaceName VARCHAR(10)
DECLARE @new bit = 1 --We have to recognize when to add element ""ThirdPartyInterfaceName":"PLIVO","
DECLARE @start bit = 1 --This variable is only used in first iteration of WHILE
DECLARE @json NVARCHAR(MAX)
SET @sql = 'SELECT @json = (SELECT '
/*
We are going to delete rows from table @Example, so we can use EXISTS in WHILE
*/
WHILE EXISTS(SELECT * FROM @Example)
BEGIN
SELECT TOP 1
@new = CASE WHEN @start = 0 THEN CASE
WHEN @ThirdPartyInterfaceData IS NOT NULL AND @ThirdPartyInterfaceName IS NOT NULL
AND (@ThirdPartyInterfaceData <> ThirdPartyInterfaceData OR @ThirdPartyInterfaceName <> ThirdPartyInterfaceName)
THEN 1
ELSE 0
END
ELSE 1 END,
@ThirdPartyInterfaceData = ThirdPartyInterfaceData,
@ThirdPartyInterfaceName = ThirdPartyInterfaceName,
@name = name,
@value = value
FROM @Example
ORDER BY ThirdPartyInterfaceData, ThirdPartyInterfaceName, Name
SET @start = 0
IF @new = 1
BEGIN
SET @sql = @sql + '''' + @ThirdPartyInterfaceName + ''' AS ''ThirdPartyInterfaceData.' + @ThirdPartyInterfaceData + '.ThirdPartyInterfaceName'', '
END
/*
Adding next element into JSON
*/
SET @sql = @sql + '''' + @value + '''' + ' AS ''ThirdPartyInterfaceData.' + @ThirdPartyInterfaceData + '.' + @name + ''', '
/*
Deleting current row
*/
DELETE FROM @Example WHERE @ThirdPartyInterfaceData = ThirdPartyInterfaceData AND
@ThirdPartyInterfaceName = ThirdPartyInterfaceName AND
@name = name AND
@value = value
END
/*
Deleting last, unnecessary comma and adding ' FOR JSON PATH'
*/
SET @sql = SUBSTRING(@sql,1,LEN(@sql) - 1) + ' FOR JSON PATH)'
/*
Executing sql, setting JSON into variable
*/
EXECUTE sp_executesql @sql, N'@json nvarchar(max) OUTPUT', @json = @json OUTPUT
/*
You can do whatever you want with this variable (insert into table etc.)
*/
SELECT @json
第二種方式(無WHILE
循環):
DECLARE @Example TABLE
(
ThirdPartyInterfaceData VARCHAR(10)
,ThirdPartyInterfaceName VARCHAR(10)
,Name VARCHAR(512)
,Value VARCHAR(800)
)
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSAuthID','MAMDQ1ODNJN2JMMZMWZD')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSAuthToken','YWU5NTlhNzgxYTA1OWY4NTFkMTM4NWY4ZjM5Y2Zl')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSFrom','Venue Metro')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSStatusMonitorURL','http://www.google.com')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSStatusMonitorURLMethod','POST')
INSERT INTO @Example VALUES('SMS','PLIVO','SYSTEM_SMSRestAPIVersion','v1')
DECLARE @sql NVARCHAR(MAX) = 'SELECT @json = (SELECT '
DECLARE @json NVARCHAR(MAX)
SELECT
@sql = @sql + JSON_Part
FROM (SELECT
ThirdPartyInterfaceData,
ROW_NUMBER() OVER (PARTITION BY ThirdPartyInterfaceData, ThirdPartyInterfaceName ORDER BY ThirdPartyInterfaceData, ThirdPartyInterfaceName, Name) AS Number,
'''' + Value + ''' AS ''ThirdPartyInterfaceData.' + ThirdPartyInterfaceData + '.' + Name + ''',' AS JSON_Part
FROM @Example
UNION ALL
SELECT DISTINCT
ThirdPartyInterfaceData,
0 AS Number,
'''' + ThirdPartyInterfaceName + ''' AS ''ThirdPartyInterfaceData.' + ThirdPartyInterfaceData + '.ThirdPartyInterfaceName'', ' AS JSON_Part
FROM @Example) a
ORDER BY ThirdPartyInterfaceData, Number
/*
Deleting last, unnecessary comma and adding ' FOR JSON PATH)'
*/
SET @sql = SUBSTRING(@sql,1,LEN(@sql) - 1) + ' FOR JSON PATH)'
PRINT @sql
/*
Executing sql
*/
EXECUTE sp_executesql @sql, N'@json nvarchar(max) OUTPUT', @json = @json OUTPUT
SELECT @json
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.