Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server FOR JSON PATH Ví dụ (T-SQL)

Khi sử dụng SQL Server, bạn có thể sử dụng FOR JSON mệnh đề trong một truy vấn để định dạng kết quả dưới dạng JSON. Khi thực hiện việc này, bạn phải chọn AUTO hoặc PATH lựa chọn. Bài viết này chứa các ví dụ về việc sử dụng PATH tùy chọn.

Cú pháp

Cú pháp như sau:

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

Vì vậy, về cơ bản, tất cả những gì bạn cần làm là thêm FOR JSON PATH vào cuối truy vấn của bạn.

Ví dụ 1 - Cách sử dụng cơ bản

Đây là một ví dụ để chứng minh.

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

Kết quả:

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

Vì vậy, kết quả xuất hiện dưới dạng tài liệu JSON được định dạng độc đáo, thay vì ở dạng hàng và cột.

Trong trường hợp này, tôi đã sử dụng TOP 3 để giới hạn kết quả được đặt thành chỉ ba kết quả.

Kết quả một dòng?

Kết quả của bạn ban đầu có thể xuất hiện trong một hàng và một cột, và dưới dạng một dòng dài như thế này:

Nếu đúng như vậy, hãy thử nhấp vào tập hợp kết quả. Tùy thuộc vào phần mềm quản lý cơ sở dữ liệu của bạn, điều này sẽ khởi chạy tài liệu JSON như nó xuất hiện trong ví dụ trên.

Điều này có hoạt động chính xác như được mô tả hay không sẽ phụ thuộc vào phần mềm mà bạn sử dụng để truy vấn SQL Server.

Tại thời điểm viết bài, điều này hoạt động tốt đối với tôi khi sử dụng SQL Operations Studio (sau đó đã được đổi tên thành Azure Data Studio). Nó cũng hoạt động tốt khi sử dụng phần mở rộng MSSQL trong VS Code. Tuy nhiên, SSMS chỉ định dạng kết quả dưới dạng một dòng dài (mặc dù vẫn ở định dạng JSON).

Tôi cũng đã có những mức độ thành công khác nhau khi sử dụng các công cụ dòng lệnh.

Bạn cũng có thể thấy rằng ban đầu kết quả được phân phối trên nhiều hàng, tùy thuộc vào mức độ lớn của tập kết quả.

Nếu bạn không thể làm cho nó hiển thị kết quả một cách hài lòng, hãy thử một công cụ khác.

Ví dụ 2 - Truy vấn trên nhiều bảng

Trong ví dụ này, tôi truy vấn hai bảng có mối quan hệ một-nhiều giữa chúng. Trong trường hợp này, mỗi nghệ sĩ có thể có nhiều album và tôi sử dụng một truy vấn con để truy xuất các album cho từng nghệ sĩ.

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;

Kết quả:

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

Trong trường hợp này, mỗi album đã được lồng trong "Album". Điều này là do các anbom được trả về thông qua một truy vấn con.

Ví dụ 3 - Đầu ra lồng nhau với ký hiệu dấu chấm

Khi sử dụng PATH , bạn có thể sử dụng tên cột được phân tách bằng dấu chấm để tạo các đối tượng lồng nhau.

Để làm điều này, hãy sử dụng bí danh được phân tách bằng dấu chấm. Đây là một ví dụ:

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

Kết quả:

[
    {
        "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"
        }
    }
]

Ví dụ 4 - Thêm nút gốc

Bạn có thể sử dụng ROOT() tùy chọn để thêm một nút gốc vào đầu ra. Điều này thêm một phần tử cấp cao nhất vào đầu ra. Để thực hiện việc này, chỉ cần thêm ROOT() vào cuối truy vấn, với tên bạn muốn nút gốc có.

Vì vậy, chúng ta có thể sửa đổi ví dụ trước thành sau:

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

Kết quả:

{
    "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"
            }
        }
    ]
}

Ví dụ 5 - Loại bỏ Trình bao bọc mảng

Bạn có thể sử dụng WITHOUT_ARRAY_WRAPPER tùy chọn để xóa dấu ngoặc vuông bao quanh kết quả.

Ví dụ:

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

Kết quả:

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

Lưu ý rằng nếu bạn làm điều này trên một kết quả nhiều hàng, bạn sẽ nhận được JSON không hợp lệ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Triển khai chức năng phân trang (bỏ qua / lấy) với truy vấn này

  2. Điều gì xảy ra với một giao dịch không được cam kết khi kết nối bị đóng?

  3. Tham số Sniffing (hoặc Spoofing) trong SQL Server

  4. Cách ORIGINAL_DB_NAME () hoạt động trong SQL Server

  5. Tập tin MDF là gì?