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

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

Trong 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ề cách sử dụng AUTO tùy chọn.

Cú pháp

Cú pháp như sau:

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

Vì vậy, về cơ bản, tất cả những gì bạn cần làm là thêm FOR JSON AUTO 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 AUTO;

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.

USE Music;
SELECT 
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO;

Kết quả:

[
    {
        "ArtistName": "AC/DC",
        "Albums": [
            {
                "AlbumName": "Powerage"
            }
        ]
    },
    {
        "ArtistName": "Allan Holdsworth",
        "Albums": [
            {
                "AlbumName": "All Night Wrong"
            },
            {
                "AlbumName": "The Sixteen Men of Tain"
            }
        ]
    },
    {
        "ArtistName": "Buddy Rich",
        "Albums": [
            {
                "AlbumName": "Big Swing Face"
            }
        ]
    },
    {
        "ArtistName": "Devin Townsend",
        "Albums": [
            {
                "AlbumName": "Ziltoid the Omniscient"
            },
            {
                "AlbumName": "Casualties of Cool"
            },
            {
                "AlbumName": "Epicloud"
            }
        ]
    },
    {
        "ArtistName": "Iron Maiden",
        "Albums": [
            {
                "AlbumName": "Powerslave"
            },
            {
                "AlbumName": "Somewhere in Time"
            },
            {
                "AlbumName": "Piece of Mind"
            },
            {
                "AlbumName": "Killers"
            },
            {
                "AlbumName": "No Prayer for the Dying"
            }
        ]
    },
    {
        "ArtistName": "Jim Reeves",
        "Albums": [
            {
                "AlbumName": "Singing Down the Lane"
            }
        ]
    },
    {
        "ArtistName": "Michael Learns to Rock",
        "Albums": [
            {
                "AlbumName": "Blue Night"
            },
            {
                "AlbumName": "Eternity"
            },
            {
                "AlbumName": "Scandinavia"
            }
        ]
    },
    {
        "ArtistName": "The Script",
        "Albums": [
            {
                "AlbumName": "No Sound Without Silence"
            }
        ]
    },
    {
        "ArtistName": "Tom Jones",
        "Albums": [
            {
                "AlbumName": "Long Lost Suitcase"
            },
            {
                "AlbumName": "Praise and Blame"
            },
            {
                "AlbumName": "Along Came Jones"
            }
        ]
    }
]

Như bạn có thể thấy, mỗi album đã được lồng trong "Album". Điều này là do AUTO tùy chọn xác định đầu ra dựa trên thứ tự của các cột trong SELECT danh sách và các bảng nguồn của chúng.

Ví dụ 3 - 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
  ArtistName, 
  AlbumName
FROM Artists
  INNER JOIN Albums
    ON Artists.ArtistId = Albums.ArtistId
ORDER BY ArtistName
FOR JSON AUTO, ROOT('Music');

Kết quả:

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

Tôi cũng giới hạn bộ kết quả chỉ có ba kết quả bằng cách thêm TOP 3 vào truy vấn.

Ví dụ 4 - 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 AUTO, 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. Chạy tất cả các tệp SQL trong một thư mục

  2. Tôi có thực sự cần sử dụng SET XACT_ABORT ON không?

  3. chuyển đổi kiểu dữ liệu varchar thành kiểu dữ liệu datetime dẫn đến giá trị nằm ngoài phạm vi

  4. Cách sys.dm_exec_describe_first_result_set hoạt động trong SQL Server

  5. Trả về danh sách các bảng &chế độ xem trong SQL Server bằng T-SQL (sp_tables)