在 T-SQL 中不使用临时 table 检查 JSON 文件信息

Checking the JSON file information without using a temp table in T-SQL

假设我的程序中有一个名为 @ImageURL 的 JSON 输入参数,具有以下结构,用于存储和操作我的上传器部分。

    [
        {
          "Title": "some title",
          "Urls": "some url",
          "Type": "application/pdf",
          "IsPrimary": true
        },
        ...
    ]

这个 JSON 字符串总是有不止一组标题、URL 等。但在某些情况下,我坚持检查它是否只包含一组,因为我不能确定 front-end 开发人员将以正确的格式为我发送 JSON。 为了检查这一点,我使用了以下似乎有效的代码,但我觉得它不干净,可能有比创建 TMP table 并检查它 COUNT 更好的方法来编写它。

    DECLARE @JSONImageFile TABLE(
        Level1ID INT,
        JSONImageFile NVARCHAR(MAX),
        JSONImageFileTitle NVARCHAR(1000),
        JSONImageFileType NVARCHAR(100),
        JSONImageFileIsPrimary BIT
    )
    
    INSERT INTO @JSONImageFile(
        Level1ID,
        JSONImageFile,
        JSONImageFileTitle,
        JSONImageFileType,
        JSONImageFileIsPrimary
    )
    SELECT
        @Level1ID,
        Urls,
        Title,
        Type,
        IsPrimary
    FROM OPENJSON(@ImageURL) WITH (
        Urls        NVARCHAR(MAX),
        Title       NVARCHAR(1000),
        Type        NVARCHAR(100),
        IsPrimary   BIT
    )

    IF (SELECT COUNT(*) FROM @JSONImageFile) = 1 /* the main code */

提前感谢您的回答。

如果是 JSON 数组,您可以尝试使用 OPENSJON() 和默认模式解析此数组并检查返回的 key 列的最大值:

JSON:

DECLARE @ImageUrl nvarchar(max) = 
N'[
        {
          "Title": "some title",
          "Urls": "some url",
          "Type": "application/pdf",
          "IsPrimary": true
        },
        {
          "Title": "some title",
          "Urls": "some url",
          "Type": "application/pdf",
          "IsPrimary": true
        }
]'

声明:

IF EXISTS (
   SELECT 1 
   FROM OPENJSON(@ImageUrl) 
   HAVING MAX(CONVERT(int, [key])) = 0
) 
   PRINT 'Success'
ELSE 
   PRINT 'Error'