2013-07-26 13 views
6

Szukam, aby pobrać niektóre kolumny (Col1 i 2) tabeli i umieścić w formacie JSON, a także napisać niektóre JSON na sztywno w każdym węźle, tak jak to.Tabela SQL Server do json

{ "kol1": "XXX", "kolumna2": "XXX", "hardcodedString": "XXX" "hardcodedString": "XXX", "hardcodedString": "xxxx" " hardcodedString ":" xxxx”, "hardcodedString": "xxxx"},

znalazłem następujący skrypt git, tworzy SP, który powinien generować JSON, ale gdy wykonywane zgodnie z wymaganiami I get 'Polecenia Zakończone pomyślnie'

Wszelkich pomysłów, gdzie wyjście idzie, a nawet jeśli lepszy sposób na osiągnięcie mojego 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

Każdy powód, dla którego musisz to zrobić w SQL? – Slicedpan

+0

Nie ma żadnego powodu - uproszczone stwierdzenie problemu polega na pobraniu zawartości tabeli SQL Server do formatu JSON podanego w pytaniu – Fearghal

Odpowiedz

6

Naprawdę nie radzę go, są znacznie lepsze sposoby robienia tego w warstwie aplikacji, ale dodaje się uniknąć pętli i jest dużo mniej gadatliwy niż obecny sposób:

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 Zmieniłem twoją nazwę obiektu dwuczęściowego (@schema i @table), aby zaakceptować pełną nazwę obiektu.

Example on SQL Fiddle

Chodzi o to, aby w zasadzie używać rozszerzenia XML w SQL Server, aby włączyć tabelę w formacie XML, a potem po prostu zastąpić tagi początkowy z {ColumnName: oraz tagi końcowym ,. Wymaga to dwóch dodatkowych zamienników, aby zatrzymać dodawanie nawiasów zamykających do ostatniej kolumny każdego wiersza i usunąć końcową wartość , z ciągu JSON.

+0

Fantastycznie, spróbuj tego i działaj na poczęstunek. Jak mogę wyprowadzić wyniki do pliku .js? – Fearghal

+0

Czy musisz automatycznie wyprowadzać to do pliku .js, czy jako plik jednorazowy? – GarethD

+0

Hej, tak, potrzebuję automatycznego wyjścia do pliku .js, myślałem o zawijaniu sp w pakiecie SSIS, ale otrzymywanie błędów w kreatorze SSIS SSIS. – Fearghal

0

W Ruby przy użyciu mysql2 gem i 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

Świetnie, jak to zrobić? – Fearghal

+0

Zalecam użycie [rvm] (https://rvm.io/) do zainstalowania ruby, a następnie uruchomienie 'gem install mysql2' (będziesz potrzebował libmysqlclient-dev). skopiuj ten kod do pliku .rb i uruchom go za pomocą ruby. – Slicedpan

+0

Dzięki, wprowadziłbym do mojego projektu inną technologię, której chcę w miarę możliwości uniknąć. Zamierzam wytrwać z SQL cmd formatowania json, a następnie próbując wyjść do płaskiego pliku. Spróbuję rzucić okiem na ruby, ponieważ wydaje się być elastycznym rozwiązaniem dla wielu zadań po stronie serwera. – Fearghal

Powiązane problemy