如何获取 JSON 字符串中行的详细行号
How to get the detail row number for rows in JSON string
我有一个存储过程,它接受一个 NVARCHAR(max) 字符串,该字符串是 JSON 数据,我需要在将其加载到实时 table 之前对其进行验证。如果验证失败,我需要 return 一条消息,其中包含问题和错误数据行的行号。这些行在 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);
推导它,但该技术不适用于 OPENJSON
如果可能的话,我宁愿不分两步进行 - 即,将数据加载到临时文件 table 中,然后使用行号
更新临时文件 table 中的行]
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)
)
原以为这会奏效,但运气不佳。
想以 table 结尾
我认为 SQL 服务器在 OPENJSON()
上没有任何类型的 WITH ORDINAL
选项。
你可以试试这个:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rownum,
ORDER BY
是必需的,(SELECT NULL)
被识别为常量,因此实际上没有排序。实际上,这应该 return 结果按 return 的顺序排列在 JSON 中,但我不认为这是有保证的。
没有 WITH
子句的 OpenJson
将 return 包含 key
、value
和 type
列的 table,其中key
是数组(整数)或对象(字符串)的键。
您可以按自己喜欢的方式处理 value
:
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
我有一个存储过程,它接受一个 NVARCHAR(max) 字符串,该字符串是 JSON 数据,我需要在将其加载到实时 table 之前对其进行验证。如果验证失败,我需要 return 一条消息,其中包含问题和错误数据行的行号。这些行在 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);
推导它,但该技术不适用于 OPENJSON
如果可能的话,我宁愿不分两步进行 - 即,将数据加载到临时文件 table 中,然后使用行号
更新临时文件 table 中的行]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)
)
原以为这会奏效,但运气不佳。
想以 table 结尾
我认为 SQL 服务器在 OPENJSON()
上没有任何类型的 WITH ORDINAL
选项。
你可以试试这个:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rownum,
ORDER BY
是必需的,(SELECT NULL)
被识别为常量,因此实际上没有排序。实际上,这应该 return 结果按 return 的顺序排列在 JSON 中,但我不认为这是有保证的。
WITH
子句的 OpenJson
将 return 包含 key
、value
和 type
列的 table,其中key
是数组(整数)或对象(字符串)的键。
您可以按自己喜欢的方式处理 value
:
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