代码之家  ›  专栏  ›  技术社区  ›  Mateen Bagheri

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

  •  0
  • Mateen Bagheri  · 技术社区  · 3 年前

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

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

    这个JSON字符串总是有多组标题、URL等。但在某些情况下,我坚持检查它是否只包含一组,因为我无法确定前端开发人员是否会以正确的格式为我发送JSON。 为了检查这一点,我使用了下面的代码,这似乎是可行的,但我觉得它不干净,可能有更好的方法来编写它,而不是创建一个TMP表并检查它的 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 */
    

    提前感谢您的回答。

    0 回复  |  直到 3 年前
        1
  •  1
  •   Zhorov    3 年前

    对于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'