簡體   English   中英

如何在SQL Server中使用列值作為節點將表數據轉換為JSON值?

[英]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表中刪除行,因此,如果要使用我的解決方案並且不從主表中刪除行,則必須創建其他表並插入所有值。 它應適用於ThirdPartyInterfaceDataThirdPartyInterfaceName列中的多個不同值。 需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM