2013-07-26 80 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