MsSql Tabloyu JSON Datasına Çevirme

MsSql Tabloyu JSON Datasına Çevirme

Merhabalar, başlıkta da belirtmiş olduğum gibi MsSql veritabanında ki bir tabloyu json datasına çevirmemiz mümkün. Normalde bu işlemi kod tarafında yapmanızda mümkün fakat öyle zamanlar gelirki tablonuzun içerisine bir tablo daha gömmeniz gerekir ama bunu performanslı bir şekilde yapamazsınız. Sizinle paylaşacağım bu kodun yaptığı işi aslında MsSql Server Management 2017 gibi versiyonlarda var olduğunu gördüm ama test etmedim, eski sürüm kullanan arkadaşara yardımcı olması için kodu ve nasıl kullanılacağını hızlıca anlatacağım.

CREATE FUNCTION [dbo].[fthbs-Str-JSON] (@IncludeHead int,@ToLowerCase int,@XML xml)
Returns varchar(max)
AS
Begin
    Declare @Head varchar(max) = '',@JSON varchar(max) = ''
    ; with cteEAV as (Select RowNr=Row_Number() over (Order By (Select NULL))
                            ,Entity    = xRow.value('@*[1]','varchar(100)')
                            ,Attribute = xAtt.value('local-name(.)','varchar(100)')
                            ,Value     = xAtt.value('.','varchar(max)') 
                       From  @XML.nodes('/row') As R(xRow) 
                       Cross Apply R.xRow.nodes('./@*') As A(xAtt) )
          ,cteSum as (Select Records=count(Distinct Entity)
                            ,Head = IIF(@IncludeHead=0,IIF(count(Distinct Entity)<=1,'[getResults]','[[getResults]]'),Concat('{"status":{"successful":"true","timestamp":"',Format(GetUTCDate(),'yyyy-MM-dd hh:mm:ss '),'GMT','","rows":"',count(Distinct Entity),'"},"results":[[getResults]]}') ) 
                       From  cteEAV)
          ,cteBld as (Select *
                            ,NewRow=IIF(Lag(Entity,1)  over (Partition By Entity Order By (Select NULL))=Entity,'',',{')
                            ,EndRow=IIF(Lead(Entity,1) over (Partition By Entity Order By (Select NULL))=Entity,',','}')
                            ,JSON=Concat('"',IIF(@ToLowerCase=1,Lower(Attribute),Attribute),'":','"',Value,'"') 
                       From  cteEAV )
    Select @JSON = @JSON+NewRow+JSON+EndRow,@Head = Head From cteBld, cteSum
    Return Replace(@Head,'[getResults]',Stuff(@JSON,1,1,''))
End
-- Parametre 1: @IncludeHead 1/0 (Başlığın eklenmesi için 1, eklenmemesi için 0)
-- Parametre 2: @ToLowerCase 1/0 (başlıkların küçük harflerle yazmasını istiyorsanız 1 yazın)
-- Parametre 3: (Select * From ... for XML RAW)

Burada dikkat edilmesi gereken konu 3. Parametrede dikkat ederseniz en sonda “for XML RAW” var. Aslında çekmek istediğimiz tablo öncelikle Sql Tarafından XML formatına dönüştürülüyor, daha sonra da biz o datayı JSON formatına çeviriyoruz. Kullanım şeklini de aşağıda sizlerle paylaşıyorum.

SELECT [dbo].[fthbs-Str-JSON](0, 1, (SELECT * FROM ogrenciler for XML RAW))

Artık MsSql içerisinde bir tabloyu direkt olarak json formatında alabilirsiniz, kod tarafında size dönen değer ilk satırın ilk sütununda yer alacaktır. Böylelikle tablonuzu diğer platformlar ile paylaşırken global kullanımı rağbet görmüş JSON formatını kolaylıkla kullanabilirsiniz.

İşinizi Görmesi dileği ile …

Paylaş :

Bu gönderiyi paylaş

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.