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ệ.