2013-07-26 81 views
6

我正在尋找拉表的一些列(Col1和2),並以JSON格式,並在每個節點寫入一些硬編碼的JSON,就像這樣。SQL Server表json

{ 「COL1」: 「XXXX」, 「COL2」: 「XXXX」, 「hardcodedString」: 「XXXX」, 「hardcodedString」: 「XXXX」, 「hardcodedString」: 「XXXX」, 「 hardcodedString「:」 XXXX」,‘hardcodedString’:‘XXXX’},

我發現下面的git的腳本,它會創建應產生JSON一個SP,但是當我按要求執行,我得到‘命令完成成功與’

任何想法,輸出是否或確實如果更好的方式來實現我的JSON?

create procedure [dbo].[GetJSON] (
    @schema_name varchar(50), 
    @table_name varchar(50), 
    @registries_per_request smallint = null 
) 
as 
begin 
    if ((select count(*) from information_schema.tables where table_schema = @schema_name and table_name = @table_name) > 0) 
    begin 
     declare @json varchar(max), 
      @line varchar(max), 
      @columns varchar(max), 
      @sql nvarchar(max), 
      @columnNavigator varchar(50), 
      @counter tinyint, 
      @size varchar(10) 

     if (@registries_per_request is null) 
     begin 
      set @size = '' 
     end 
     else 
     begin 
      set @size = 'top ' + convert(varchar, @registries_per_request) 
     end 
     set @columns = '{' 

     declare schemaCursor cursor for 
      select column_name 
      from information_schema.columns 
      where table_schema = @schema_name 
      and table_name = @table_name 
     open schemaCursor 

     fetch next from schemaCursor into @columnNavigator 

     select @counter = count(*) 
     from information_schema.columns 
     where table_schema = @schema_name 
     and table_name = @table_name 

     while @@fetch_status = 0 
     begin 
      set @columns = @columns + '''''' + @columnNavigator + ''''':'''''' + convert(varchar, ' + @columnNavigator + ') + ''''''' 
      set @counter = @counter - 1 
      if (0 != @counter) 
      begin 
       set @columns = @columns + ',' 
      end 

      fetch next from schemaCursor into @columnNavigator 
     end 

     set @columns = @columns + '}' 

     close schemaCursor 
     deallocate schemaCursor 

     set @json = '[' 

     set @sql = 'select ' + @size + '''' + @columns + ''' as json into tmpJsonTable from [' + @schema_name + '].[' + @table_name + ']' 
     exec sp_sqlexec @sql 

     select @counter = count(*) from tmpJsonTable 

     declare tmpCur cursor for 
      select * from tmpJsonTable 
     open tmpCur 

     fetch next from tmpCur into @line 

     while @@fetch_status = 0 
     begin 
      set @counter = @counter - 1 
      set @json = @json + @line 
      if (0 != @counter) 
      begin 
       set @json = @json + ',' 
      end 

      fetch next from tmpCur into @line 
     end 

     set @json = @json + ']' 

     close tmpCur 
     deallocate tmpCur 
     drop table tmpJsonTable 

     select @json as json 
    end 
end 
+6

爲什麼你必須在SQL中執行此操作? – Slicedpan

+0

沒有理由 - 簡化問題陳述是將SQL Server表格內容轉換爲問題 – Fearghal

回答

6

我不會真的建議呢,還有在應用層這樣做的更好的方法,但下面避免環路,並比現在的方法少很多:

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 

NB我已經將您的兩個零件對象名稱(@schema和@table)更改爲接受完整的對象名稱。

Example on SQL Fiddle

的想法是基本上使用SQL-Server中的XML擴展把錶轉換成XML,然後只需用,替換{ColumnName:開始標記和結束標記。然後它需要兩次替換才能停止將結束括號添加到每行的最後一列,並從JSON字符串中刪除最後的,

+0

夢幻般的,這個ram和工作的一種享受。我怎樣才能輸出結果到一個.js文件? – Fearghal

+0

您是否需要自動將其輸出到.js文件或作爲一個關閉? – GarethD

+0

嘿,是的需要自動輸出到一個.js文件,我正在考慮將SS包裝在SSIS包中,但在SSMS SSIS嚮導中出現錯誤。 – Fearghal

0

在使用紅寶石寶石mysql2和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

中提供的JSON格式好,我該如何運行? – Fearghal

+0

我建議使用[rvm](https://rvm.io/)安裝ruby,然後運行'gem install mysql2'(您需要安裝libmysqlclient-dev)。將此代碼複製到一個.rb文件並使用ruby運行它。 – Slicedpan

+0

謝謝,這將引入另一項技術到我想避免的項目中,如果可能的話。我將繼續使用SQL cmd格式化json,然後嘗試輸出到平面文件。我會去看看紅寶石,但它似乎是一個靈活的解決方案,爲許多服務器端mw工作。 – Fearghal