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

Bảng SQL Server thành json

Tôi sẽ không thực sự khuyên bạn điều này, có nhiều cách tốt hơn để thực hiện việc này trong lớp ứng dụng, nhưng những cách sau tránh được các vòng lặp và ít dài dòng hơn nhiều so với phương pháp hiện tại của bạn:

CREATE PROCEDURE dbo.GetJSON @ObjectName VARCHAR(255), @registries_per_request smallint = null
AS
BEGIN
    IF OBJECT_ID(@ObjectName) IS NULL
        BEGIN
            SELECT Json = '';
            RETURN
        END;

    DECLARE @Top NVARCHAR(20) = CASE WHEN @registries_per_request IS NOT NULL 
                                    THEN 'TOP (' + CAST(@registries_per_request AS NVARCHAR) + ') ' 
                                    ELSE '' 
                                END;

    DECLARE @SQL NVARCHAR(MAX) = N'SELECT ' + @Top + '* INTO ##T ' + 
                                'FROM ' + @ObjectName;

    EXECUTE SP_EXECUTESQL @SQL;

    DECLARE @X NVARCHAR(MAX) = '[' + (SELECT * FROM ##T FOR XML PATH('')) + ']';


    SELECT  @X = REPLACE(@X, '<' + Name + '>', 
                    CASE WHEN ROW_NUMBER() OVER(ORDER BY Column_ID) = 1 THEN '{'
                         ELSE '' END + Name + ':'),
            @X = REPLACE(@X, '</' + Name + '>', ','),
            @X = REPLACE(@X, ',{', '}, {'),
            @X = REPLACE(@X, ',]', '}]')
    FROM    sys.columns
    WHERE   [Object_ID] = OBJECT_ID(@ObjectName)
    ORDER BY Column_ID;

    DROP TABLE ##T;

    SELECT  Json = @X;

END

N.B. Tôi đã thay đổi tên đối tượng hai phần của bạn (@schema và @table) để chỉ chấp nhận tên đối tượng đầy đủ.

Ví dụ trên SQL Fiddle

Về cơ bản, ý tưởng là sử dụng tiện ích mở rộng XML trong SQL-Server để chuyển bảng thành XML, sau đó chỉ cần thay thế các thẻ bắt đầu bằng {ColumnName: và các thẻ kết thúc bằng , . Sau đó, nó yêu cầu thêm hai thay thế nữa để dừng thêm dấu ngoặc đóng vào cột cuối cùng của mỗi hàng và xóa , cuối cùng từ chuỗi 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. Làm thế nào để bạn nhóm theo bất kỳ khoảng thời gian dựa trên?

  2. Msg 4834 Bạn không có quyền sử dụng câu lệnh tải hàng loạt

  3. Quyền truy cập chỉ đọc vào nội dung thủ tục được lưu trữ

  4. Chọn nhiều hàng SQL thành một hàng

  5. datetime2 so với smalldatetime trong SQL Server:Sự khác biệt là gì?