Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Примери за SQL Server ЗА JSON ПЪТ (T-SQL)

Когато използвате SQL сървър, можете да използвате FOR JSON клауза в заявка за форматиране на резултатите като JSON. Когато правите това, трябва да изберете или AUTO или PATH опция. Тази статия съдържа примери за използване на PATH опция.

Синтаксис

Синтаксисът е така:

SELECT ...
  (your query goes here)
FOR JSON PATH;

Така че по принцип всичко, което трябва да направите, е да добавите FOR JSON PATH до края на вашата заявка.

Пример 1 – Основна употреба

Ето пример за демонстрация.

USE Music;
SELECT TOP 3 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON PATH;

Резултат:

[
    {
        "AlbumName": "Powerslave",
        "ReleaseDate": "1984-09-03"
    },
    {
        "AlbumName": "Powerage",
        "ReleaseDate": "1978-05-05"
    },
    {
        "AlbumName": "Singing Down the Lane",
        "ReleaseDate": "1956-01-01"
    }
]

Така резултатите излизат като добре форматиран JSON документ, вместо в редове и колони.

В този случай използвах TOP 3 за да ограничите набора от резултати до само три резултата.

Резултати от един ред?

Резултатите ви може първоначално да се показват в един ред и една колона и като един дълъг ред като този:

Ако случаят е такъв, опитайте да щракнете върху набора от резултати. В зависимост от вашия софтуер за управление на база данни, това трябва да стартира JSON документа, както е показано в горния пример.

Дали това работи точно както е описано ще зависи от софтуера, който използвате за запитване на SQL Server.

Към момента на писане това работи добре за мен, когато използвах SQL Operations Studio (което оттогава е преименувано на Azure Data Studio). Също така работи добре при използване на разширението MSSQL в VS Code. SSMS обаче форматира резултатите само като един дълъг ред (въпреки че все още във формат JSON).

Освен това имах различна степен на успех с помощта на инструменти на командния ред.

Може също така да откриете, че резултатите първоначално са разпределени в няколко реда в зависимост от това колко голям е наборът от резултати.

Ако не можете да го накарате да показва резултатите по задоволителен начин, опитайте друг инструмент.

Пример 2 – Заявка в множество таблици

В този пример правя заявка за две таблици, които имат връзка едно към много между тях. В този случай всеки изпълнител може да има много албуми и аз използвам подзаявка, за да извличам албумите за всеки изпълнител.

USE Music;
SELECT TOP 2 ArtistName,
    (SELECT AlbumName 
        FROM Albums
        WHERE Artists.ArtistId = Albums.ArtistId
        FOR JSON PATH) AS Albums
FROM Artists
ORDER BY ArtistName
FOR JSON PATH;

Резултат:

[
    {
        "ArtistName": "AC/DC",
        "Albums": [
            {
                "AlbumName": "Powerage"
            }
        ]
    },
    {
        "ArtistName": "Allan Holdsworth",
        "Albums": [
            {
                "AlbumName": "All Night Wrong"
            },
            {
                "AlbumName": "The Sixteen Men of Tain"
            }
        ]
    }
]

В този случай всеки албум е вложен под „Албуми“. Това е така, защото албумите се връщат чрез подзаявка.

Пример 3 – Вложен изход с точка нотация

Когато използвате PATH опция, можете да използвате разделени с точки имена на колони, за да създадете вложени обекти.

За да направите това, използвайте псевдоним, разделен с точки. Ето един пример:

USE Music;
SELECT TOP 3 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH;

Резултат:

[
    {
        "AlbumId": 1,
        "Details": {
            "Album Name": "Powerslave",
            "Release Date": "1984-09-03"
        }
    },
    {
        "AlbumId": 2,
        "Details": {
            "Album Name": "Powerage",
            "Release Date": "1978-05-05"
        }
    },
    {
        "AlbumId": 3,
        "Details": {
            "Album Name": "Singing Down the Lane",
            "Release Date": "1956-01-01"
        }
    }
]

Пример 4 – Добавяне на коренен възел

Можете да използвате ROOT() опция за добавяне на главен възел към изхода. Това добавя един единствен елемент от най-високо ниво към изхода. За да направите това, просто добавете ROOT() опция до края на заявката с името, което искате да има основният възел.

Така че можем да модифицираме предишния пример към това:

USE Music;
SELECT TOP 3 
  AlbumId,
  AlbumName AS 'Details.Album Name', 
  ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH, ROOT('Albums');

Резултат:

{
    "Albums": [
        {
            "AlbumId": 1,
            "Details": {
                "Album Name": "Powerslave",
                "Release Date": "1984-09-03"
            }
        },
        {
            "AlbumId": 2,
            "Details": {
                "Album Name": "Powerage",
                "Release Date": "1978-05-05"
            }
        },
        {
            "AlbumId": 3,
            "Details": {
                "Album Name": "Singing Down the Lane",
                "Release Date": "1956-01-01"
            }
        }
    ]
}

Пример 5 – Премахване на обвивката на масива

Можете да използвате WITHOUT_ARRAY_WRAPPER опция за премахване на квадратните скоби, които обграждат резултатите.

Пример:

USE Music;
SELECT TOP 1 
  AlbumName, 
  ReleaseDate
FROM Albums
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

Резултат:

{
    "AlbumName": "Powerslave",
    "ReleaseDate": "1984-09-03"
}

Имайте предвид, че ако направите това с резултат от няколко реда, ще получите невалиден JSON.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server REPLACE() срещу TRANSLATE():Какви са разликите?

  2. Използване на изходни параметри на съхранената процедура в C#

  3. Как мога да вляза в съхранена процедура на SQL Server от моя C# код?

  4. Операцията не е валидна за състоянието на грешката на транзакцията и обхвата на транзакцията

  5. Внедряване на пейджинг с помощта на OFFSET FETCH NEXT в SQL Server