4

我有一个存储过程,它接受一个 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);

派生它,但该技术不适用于 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)
)

以为这会奏效,但没有运气。

想得到一张像这样的桌子 样本结果集

4

2 回答 2

7

OpenJsonwithoutWITH子句将返回一个包含key,valuetype列的表,其中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
于 2019-04-16T14:42:17.573 回答
4

我不认为 SQL ServerWITH ORDINALOPENJSON().

你可以试试这个:

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rownum, 

ORDER BY是必需的,并且被(SELECT NULL)识别为常数,因此实际上没有排序。在实践中,这应该以 JSON 中返回的顺序返回结果,但我认为这不能保证。

于 2019-04-16T14:28:25.117 回答