SQL Server table to json

后端 未结 3 704
说谎
说谎 2020-12-15 09:12

I am looking to pull some columns (Col1 and 2) of a table and put in JSON format and also write some hardcoded JSON in each node, like this.

{ \"col1

相关标签:
3条回答
  • 2020-12-15 09:31

    Use from the magic words For JSON

    example:

     SELECT name, surname  
     FROM emp  
     FOR JSON AUTO  
    

    result:

    [{"name": "John"}, {"name": "Jane", "surname": "Doe"}]
    

    more info in:

    https://docs.microsoft.com/en-us/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-2017&viewFallbackFrom=sql-server-2014

    0 讨论(0)
  • 2020-12-15 09:35

    I wouldn't really advise it, there are much better ways of doing this in the application layer, but the following avoids loops, and is a lot less verbose than your current method:

    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. I've changed your two part object name (@schema and @table) to just accept the full object name.

    Example on SQL Fiddle

    The idea is to basically use the XML extension within SQL-Server to turn the table into XML, then just replace the start tags with {ColumnName: and the end tags with ,. It then requires two more replaces to stop add the closing bracket to the last column of each row, and the remove the final , from the JSON string.

    0 讨论(0)
  • 2020-12-15 09:43

    In ruby using mysql2 gem and json

    require 'mysql2'
    require 'json'
    
    client = Mysql2::Client.new(:host => "localhost", :username => "user", :password => "your_pass", :database => "db_name")
    results = client.query("SELECT col1, col2 FROM table LIMIT 3").to_a
    
    results.each do |res|
      res.merge!({:hardcoded => "xxxx", :hardcoded2 => "xxxxy"})
    end
    
    puts JSON.generate results
    
    0 讨论(0)
提交回复
热议问题