Kei*_*ler 3 sql sql-server json row-number open-json
我有一个存储过程,它接受一个 NVARCHAR(max) 字符串,该字符串是我需要在将其加载到实时表之前验证的 JSON 数据。如果验证失败,我需要返回带有问题和错误数据行的行号的消息。这些行没有在 JSON 字符串中分配编号,但由它们在字符串中的存储顺序暗示。我正在尝试在 OPENJSON 函数期间分配一个增量编号。
使用 XML 时,我可以这样做:
SELECT ROW_NUMBER() OVER (ORDER BY item) AS rowOrder
, item.value('(./Id/text())[1]', 'bigInt') AS EId
, item.value('(./Name/text())[1]', 'nvarchar(255)') AS EName
, item.value('(./Number/text())[1]', 'nvarchar(30)') AS ENumber
FROM @ERow.nodes('/variable/item') AS main(item);
Run Code Online (Sandbox Code Playgroud)
派生它,但该技术不适用于 OPENJSON
如果可能的话,我宁愿不分两次进行 - 即将数据加载到临时表中,然后使用行号更新临时表中的行
SELECT ROW_NUMBER() OVER () AS rownum
, newColumnName
, decimal_column
, nvarchar_column
FROM OPENJSON(@JSON_String)
WITH (
newColumnName BIGINT '$.id_column',
decimal_column DEC(28,8),
nvarchar_column NVARCHAR(30)
)
Run Code Online (Sandbox Code Playgroud)
以为这会奏效,但没有运气。
OpenJson without WITH clause will return a table containing key, value and type columns, where key is the key of the array (integer) or object (string).
You can process the value any way you like:
SELECT j1.[key]
, j2.*
, JSON_VALUE(j1.[value], '$.nvarchar_column') AS [another example]
FROM OPENJSON('[
{"id_column": 1234, "decimal_column": 12.34, "nvarchar_column": "asdf"},
{"id_column": 5678, "decimal_column": 56.78, "nvarchar_column": "fdsa"}
]') AS j1
CROSS APPLY OPENJSON (j1.[value]) WITH (
id_column BIGINT,
decimal_column DEC(28, 8),
nvarchar_column NVARCHAR(30)
) AS j2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2834 次 |
| 最近记录: |