如何获取JSON字符串中行的详细行号

时间:2019-04-16 14:20:38

标签: sql json sql-server row-number open-json

我有一个存储过程,该过程接受NVARCHAR(max)字符串,这是在将其加载到活动表之前需要验证的JSON数据。如果验证失败,我需要返回一条消息,其中包含问题和错误数据行的行号。这些行在JSON字符串中没有分配编号,但是行在字符串中的存储顺序暗示了这一点。我正在尝试在OPENJSON函数期间分配一个增量数字。

使用XML时,我可以这样做:

<ul class="nav navbar-nav">
    <li><a href="<?php echo BASE_URL ?>">Home</a></li>
    <?php 
         foreach($this->parent_category as $cat){
            foreach($this->child_category as $child_cat){
                if($cat['id']==$child_cat['parent_id']){
    ?>
        <li class="dropdown">
            <a class="dropdown-toggle" data-toggle="dropdown" href="#"><?php echo $cat['name'];?>
            <span class="caret"></span></a>
            <ul class="dropdown-menu">
                <li><a href="#"><?php echo $child_cat['name']?></a></li>
            </ul>
        </li>
    <?php
                }elseif($cat['parent_id']==0){
    ?>
        <li><a href="<?php echo $cat['url']?>"><span><?php echo $cat['name'];?></span></a></li>
    <?php
                }
     ?>

    <?php }}?>

派生它,但该技术不适用于OPENJSON

如果可能的话,我宁愿不进行两次传递-即将数据加载到临时表中,然后使用行号更新临时表中的行

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);

以为这行得通,但是没有运气。

想结束一个像 Sample Result Set

2 个答案:

答案 0 :(得分:2)

不带WITH子句的

OPEN_JSON将返回一个包含keyvaluetype列的表,其中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

答案 1 :(得分:1)

我认为SQL Server在WITH ORDINAL上没有任何OPENJSON()选项。

您可以尝试以下方法:

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

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