6

我正在尝试使用 Json_Modify 更新所有列的值:

DECLARE @JSON NVARCHAR(MAX)
SET @JSON = 
N'{
"A":1,
"TMP": [    
    {"A":"VALUE1", "B": "VALUE2", "C": 1},
    {"A":"VALUE3", "B": "VALUE4", "C": 2},
    {"A":"VALUE5", "B": "VALUE6", "C": 3}]}
'

SET @JSON = JSON_MODIFY(@JSON, '$.TMP.A', 'JEJE')

SELECT * FROM OPENJSON(@JSON, '$.TMP') WITH ( A NCHAR(10), B NCHAR(10), C INT )

例如,我需要用“JEJE”更新所有“A”列,它不起作用。

4

3 回答 3

4

这里有两个选项。免责声明:我不是 sql server 2016 的 JSON 专家,但我已经一起破解了一些东西。

选项 1:您显然是从 JSON 字符串创建结果集。为什么不创建结果集然后更新它?

DECLARE @jsontable TABLE (A varchar(50), b varchar(50), c varchar(50))
DECLARE @JSON NVARCHAR(MAX)

SET @JSON = 
N'{
"A":1,
"TMP": [    
    {"A":"VALUE1", "B": "VALUE2", "C": 1},
    {"A":"VALUE3", "B": "VALUE4", "C": 2},
    {"A":"VALUE5", "B": "VALUE6", "C": 3}]}
'

--SET @JSON = JSON_MODIFY(@JSON, '$.TMP.A', 'JEJE')
INSERT INTO @jsontable (a,b,c)
SELECT * FROM OPENJSON(@JSON, '$.TMP') WITH ( A NCHAR(10), B NCHAR(10), C INT )

UPDATE @jsontable 
SET a = 'JEJE' 

SELECT * 
FROM @jsontable

选项 2:您可以操作 JSON 组件,但您必须将索引传递给函数。

DECLARE @JSON NVARCHAR(MAX)
SET @JSON = 
N'{
"A":1,
"TMP": [    
    {"A":"VALUE1", "B": "VALUE2", "C": 1},
    {"A":"VALUE3", "B": "VALUE4", "C": 2},
    {"A":"VALUE5", "B": "VALUE6", "C": 3}]}
'

SET @JSON = JSON_MODIFY(@JSON, '$.TMP[0].A', 'JEJE')
SET @JSON = JSON_MODIFY(@JSON, '$.TMP[1].A', 'JEJE')
SET @JSON = JSON_MODIFY(@JSON, '$.TMP[2].A', 'JEJE')

SELECT * FROM OPENJSON(@JSON, '$.TMP') WITH ( A NCHAR(10), B NCHAR(10), C INT )
于 2016-12-29T19:56:02.287 回答
2

如果要将数组存储在字段中,则可以执行以下操作:

UPDATE some_table SET
    some_field = '[' + (
        SELECT
            STRING_AGG(JSON_MODIFY([value],'$.A', 'JEJE'), ',') WITHIN GROUP (ORDER BY CAST([key] AS int))
        FROM
            OPENJSON(some_field)
    ) + ']'
于 2020-06-30T00:09:41.777 回答
1

我认为这可能会有所帮助:

CREATE PROCEDURE SP__SYSTEM___UPDATE_COLUMN_FROM_JSON
    @JSON NVARCHAR(MAX) OUTPUT,
    @COLUMN VARCHAR(50),
    @NEW_VALUE VARCHAR(50)
AS
BEGIN
    DECLARE @QUERY NVARCHAR(MAX)
    DECLARE @INDEX INT = 0

    WHILE @INDEX < (SELECT COUNT(*) FROM OPENJSON(@JSON))
    BEGIN
        SELECT @QUERY = CONCAT(N'SELECT @JSON = JSON_MODIFY(@JSON, ''$[', @INDEX, N'].',@COLUMN,''', ',@NEW_VALUE,')')
        EXEC SP_EXECUTESQL @QUERY, N'@JSON NVARCHAR(MAX) OUTPUT', @JSON = @JSON OUTPUT
        SET @INDEX = @INDEX + 1
    END
END

你像这样执行它:

BEGIN
    DECLARE @JSON VARCHAR(MAX) = '[{"ID":1,"USERID":0},{"ID":2,"USERID":0},{"ID":3,"USERID":0}]'
    EXEC SP__SYSTEM___UPDATE_COLUMN_FROM_JSON @JSON OUTPUT, 'USERID', '100'
    SELECT @JSON
END
于 2018-09-21T16:14:32.580 回答