从JSON加载数据时如何对表进行排序和插入

时间:2018-10-11 06:03:50

标签: sql sql-server

我需要帮助将数据从JSON加载到表中,但是将它们排序/排序并插入到表中?

DECLARE @IN_DATESJSON NVARCHAR(MAX) = N'[{"CreatedDate":"2018-10-10T09:07:29Z"},{"CreatedDate":"2018-10-09T09:07:29Z"},{"CreatedDate":"2018-10-08T07:07:08Z"}]';
DECLARE @V_CALLSTBL AS TABLE (CreatedDate DATETIME);
IF (ISJSON(@IN_DATESJSON) = 1)
    BEGIN  
        INSERT INTO @V_CALLSTBL
        SELECT *
        FROM OPENJSON (@IN_DATESJSON)
        WITH (CreatedDate DATETIME2)
        -- ORDER BY CreatedDate ASC -- THIS DOESN'T WORK*
    END
SELECT * FROM @V_CALLSTBL;

CreatedDate
-----------------------
2018-10-10 09:07:29.000
2018-10-09 09:07:29.000
2018-10-08 07:07:08.000

2 个答案:

答案 0 :(得分:2)

实际上,它会插入ordered,但您也应该选择order by。因为select不能保证返回已插入的排序数据。

SELECT * FROM @V_CALLSTBL ORDER BY CreatedDate ASC;

,您可以在表中添加一个身份列以查看此情况。

DECLARE @IN_DATESJSON NVARCHAR(MAX) = N'[{"CreatedDate":"2018-10-10T09:07:29Z"},{"CreatedDate":"2018-10-09T09:07:29Z"},{"CreatedDate":"2018-10-08T07:07:08Z"}]';
DECLARE @V_CALLSTBL AS TABLE (ID INT IDENTITY(1,1), CreatedDate DATETIME);
IF (ISJSON(@IN_DATESJSON) = 1)
    BEGIN  
        INSERT INTO @V_CALLSTBL
        SELECT *
        FROM OPENJSON (@IN_DATESJSON)
            WITH (CreatedDate DATETIME2)
        ORDER BY CreatedDate ASC -- THIS DOESN'T WORK*
    END
SELECT * FROM @V_CALLSTBL ORDER BY CreatedDate ASC;

答案 1 :(得分:1)

如果未在SELECT语句中指定ORDER BY子句,则不能保证返回的数据集将被排序。

此外,要保持特定的表数据有序,您应该在该表列上指定集群索引。当在过滤条件中对该列进行搜索时,这将用于更快地获取数据。

同样,如果您不使用ORDER BY子句,则无法保证排序