这个问题在这个 SO 线程中有一个参考。
我想计算MAX()
以下 JSON 的值。此外,其中的键也不是固定的,因此根据上述解决方案,它们不能在代码中硬编码。
DECLARE @json nvarchar(max) = ''{"value": [
{
"AEDAT": "20211119",
"ERDAT": "20211119"
},
{
"AEDAT": "20211119",
"ERDAT": "20211112"
},
{
"AEDAT": "20211123",
"ERDAT": "20211123"
},
{
"AEDAT": "00000000",
"ERDAT": "20211119"
},
{
"AEDAT": "00000000",
"ERDAT": "20211123"
}]}';
此外,我将从其他一些 SP 获取以下字符串作为参数。
DECLARE @ColumnName = 'AEDAT,ERDAT' ---I shall be getting this as an output from another SP.
综上所述,我的做法如下:
DECLARE @col_table TABLE (ID int IDENTITY(1,1), ColumnName varchar(100))
INSERT INTO @col_table SELECT value as ColumnName FROM STRING_SPLIT(@ColumnName,',');
DECLARE @max_val TABLE (ID int IDENTITY(1,1), LastUpdatedValue int)
DECLARE @max_ID int
DECLARE @min_ID int
DECLARE @1st_col varchar(max)
SELECT @max_ID = MAX(ID),@min_ID = MIN(ID) FROM @col_table GROUP BY ColumnName;
WHILE (@min_ID <= @max_ID)
BEGIN
SELECT @1st_col = ColumnName FROM @col_table WHERE ID = @min_ID
INSERT INTO @max_val (LastUpdatedValue)
SELECT JSON_VALUE(j.value,'$.' +@1st_col+ '' ) FROM OPENJSON(@json,'$.value') AS j
SET @min_ID = @min_ID + 1
END
理想情况下,上述方法应该给出 10 个值(AEDAT 和 ERDAT 各 5 个)但这给了我 5 个值。
SELECT * FORM @max_val;
ID LastUpdatedValue
1 20211119
2 20211112
3 20211123
4 20211119
5 20211123
我期待像UNION ALL
所有键一样的输出。像下面
SELECT JSON_VALUE(j.value,'$.AEDAT') FROM OPENJSON(@json,'$.value') AS j
UNION ALL
SELECT JSON_VALUE(j.value,'$.ERDAT') FROM OPENJSON(@json,'$.value') AS j
我错过了什么?请建议。