2013-07-26 25 views
6

テーブルのいくつかの列(Col1と2)を取得し、JSON形式で配置し、各ノードにハードコードされたJSONを書き込むことを検討しています。jsonへのSQL Serverテーブル

{ "COL1": "XXXX"、 "COL2": "XXXX"、 "hardcodedString": "XXXX"、 "hardcodedString": "XXXX"、 "hardcodedString": "XXXX"、 " hardcodedString「:」XXXX」、 『hardcodedString』: 『XXXX』}、

私は次のgitのスクリプトを見つけたが、それはJSONを生成する必要がありますSPを作成しますが、必要に応じて、私が実行したとき、私は 『正常に完了するコマンド』を取得

私のJSONを習得するためのより良い方法があれば、実際に出力が行われているかどうかは分かりますか? Rubyで

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テーブルの内容をJSON形式に変換します。 – 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私はあなたの2つの部分オブジェクト名(@schemaと@table)を変更して、完全なオブジェクト名を受け入れました。

Example on SQL Fiddle

アイデアは、基本的にそしてちょうど,{ColumnName:と、開始タグと終了タグを置き換える、XMLにテーブルを回すためにSQL-Server内のXML拡張機能を使用することです。次に、各行の最後の列に閉じる括弧を追加するのを止めるために2つ以上の置換えが必要です。最後にJSON文字列から,を削除してください。

+0

素晴らしい、これはラムこれを扱うと扱います。どのように結果を.jsファイルに出力できますか? – Fearghal

+0

これを自動的に.jsファイルに出力する必要がありますか? – GarethD

+0

ねえ、はい.jsファイルに自動出力する必要があります。私はSSISパッケージでspをラップすることを考えていましたが、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

これはどうですか? – Fearghal

+0

[rvm](https://rvm.io/)を使ってrubyをインストールしてから、 'gem install mysql2'を実行することをお勧めします(libmysqlclient-devがインストールされている必要があります)。このコードを.rbファイルにコピーし、rubyを使用して実行します。 – Slicedpan

+0

ありがとう、これは可能な場合私が避けたい私のプロジェクトに別の技術を導入するでしょう。私は、jsonをフォーマットしてから、フラットファイルに出力しようとしているSQL cmdで辛抱するつもりです。私は多くのサーバー側のmwジョブのための柔軟なソリューションと思われるので、ルビーを見てみましょう。 – Fearghal

関連する問題