SQL de JSON Islemleri - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Veri Tabanı (https://www.delphican.com/forumdisplay.php?fid=4) +--- Forum: MS SQL Server (https://www.delphican.com/forumdisplay.php?fid=103) +--- Konu Başlığı: SQL de JSON Islemleri (/showthread.php?tid=3553) |
SQL de JSON Islemleri - adelphiforumz - 16-04-2019 Selamlar SQL 2016 ve üst sürümlerinde kullanabileceğiniz JSON formatındaki bir veriyi işlerken eğer array içinde array varsa çalıştırabileceğiniz bir yöntem Detaylı örnekler için https://docs.microsoft.com/en-us/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-2017 JSON To Table DECLARE @json NVARCHAR(MAX) = '{ "Ad" : "Ad 1", "Soyad" : "Soyad 1", "Adresler" : [{ "AdresTip" : "Merkez", "Ulke" : "TR", "Il" : "34", "Ilce" : "Kadıköy", "Telefonlar" : [{ "TelTip" : "Tel", "Numara": "34-12" }, { "TelTip" : "Fax", "Numara": "34-34" } ] }, { "AdresTip" : "Sube", "Ulke" : "TR", "Il" : "34", "Ilce" : "Şişli", "Telefonlar" : [{ "TelTip" : "Tel", "Numara": "34-56" }, { "TelTip" : "Fax", "Numara": "34-78" } ] } , { "AdresTip" : "Merkez", "Ulke" : "TR", "Il" : "35", "Ilce" : "Alsancak", "Telefonlar" : [{ "TelTip" : "Tel", "Numara": "35-12" }, { "TelTip" : "Fax", "Numara": "35-34" } ] }, { "AdresTip" : "Sube", "Ulke" : "TR", "Il" : "35", "Ilce" : "Karşıyaka", "Telefonlar" : [{ "TelTip" : "Tel", "Numara": "35-56" }, { "TelTip" : "Fax", "Numara": "35-78" } ] } ] }' SELECT TKisiler.Ad ,TKisiler.Soyad ,TAdresler.[AdresTip] ,TAdresler.[Ulke] ,TAdresler.[Il] ,TAdresler.[Ilce] ,TTelefonlar.[TelTip] ,TTelefonlar.[Numara] FROM OPENJSON(@json) WITH ( Ad NVARCHAR(25) '$.Ad' ,Soyad NVARCHAR(25) '$.Soyad' ,Adresler NVARCHAR(MAX) '$.Adresler' AS JSON ) AS TKisiler CROSS Apply OPENJSON(Adresler, '$') WITH ( [AdresTip] NVARCHAR(25) '$.AdresTip' ,[Ulke] NVARCHAR(25) '$.Ulke' ,[Il] NVARCHAR(25) '$.Il' ,[Ilce] NVARCHAR(25) '$.Ilce' ,Telefonlar NVarchar(MAX) '$.Telefonlar' AS JSON ) AS TAdresler CROSS Apply OPENJSON(Telefonlar, '$') WITH ( [TelTip] NVARCHAR(25) '$.TelTip' ,[Numara] NVARCHAR(25) '$.Numara' ) AS TTelefonlar Table To JSON Format Select * From Table For JSON Pathyada Select * From Table For JSON Auto Table To JSON Array Format (Alıntı) DROP TABLE IF EXISTS #Home; GO DROP TABLE IF EXISTS #Car; GO DROP TABLE IF EXISTS #Toy; GO CREATE TABLE #Home ( HomeId int IDENTITY PRIMARY KEY, City nvarchar(20), State nchar(2) ); GO CREATE TABLE #Car ( CarId int IDENTITY PRIMARY KEY, HomeId int, Year smallint, Make nvarchar(20), Model nvarchar(20), FOREIGN KEY (HomeId) REFERENCES #Home(HomeId) ); GO CREATE TABLE #Toy ( ToyId int IDENTITY PRIMARY KEY, HomeId int, Category nvarchar(20), RiderCapacity int, FOREIGN KEY (HomeId) REFERENCES #Home(HomeId) ); GO INSERT INTO #Home (City,State) VALUES ('Cleveland','OH') INSERT INTO #Home (City,State) VALUES ('Malibu','CA') INSERT INTO #Car (HomeId,Year, Make, Model) VALUES ('1','2017', 'Volkswagen', 'Golf') INSERT INTO #Car (HomeId,Year, Make, Model) VALUES ('2','2014', 'Porsche', '911') INSERT INTO #Toy (HomeId,Category, RiderCapacity) VALUES ('1','Bicycle', 1) INSERT INTO #Toy (HomeId,Category, RiderCapacity) VALUES ('2','Kayak', 2) SELECT * FROM #Home SELECT * FROM #Car SELECT * FROM #Toy SELECT h.HomeId, h.City, h.State, GarageItems = JSON_QUERY('[' + STRING_AGG( GarageItems.DynamicData,',') + ']','$') FROM #Home h INNER JOIN ( SELECT HomeId, JSON_QUERY(Cars,'$') AS DynamicData FROM #Home h CROSS APPLY ( SELECT ( SELECT * FROM #Car c WHERE c.HomeId = h.HomeId FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) AS Cars ) d UNION ALL SELECT HomeId, JSON_QUERY(Cars,'$') AS DynamicData FROM #Home h CROSS APPLY ( SELECT ( SELECT * FROM #Toy c WHERE c.HomeId = h.HomeId FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) AS Cars ) d ) GarageItems ON h.HomeId = GarageItems.HomeId GROUP BY h.HomeId, h.City, h.State SQL de JSON Islemleri - Tuğrul HELVACI - 16-04-2019 Ellerinize sağlık. SQL de JSON Islemleri - adelphiforumz - 16-04-2019 Tekrar Selamlar Acaba elimizdeki bir table verisini aynı şekilde String birleştirme yolu olmadan direkt JSon yapıya çeviren yapı nasıl yapılır. Mesela ilk verdiğim örneğin tablo verisinin aynı şekilde JSON ARRAY formatına dönüşmesi gibi Teşekkürler Cvp: SQL de JSON Islemleri - TescilsizUzman - 16-04-2019 (16-04-2019, Saat: 10:27)adelphiforumz Adlı Kullanıcıdan Alıntı: Tekrar Selamlar Merhaba, FireDAC bileşen seti kullanıyorsanız bir kaç çözüm yolu sunabilirim. I. Yöntem TFDJSONDataSets ve TFDJSONDataSetsWriter sınıflarını kullanabilirsiniz. Elde ettiğiniz JSONDataSet'i TFDJSONDataSetsReader sınıf yardımıyla çözümleyerek DataSet yapısına yeniden dönüştürebilirsiniz. Örnek, 1- DataSnap REST Application 2- FireDACJSONReflect for DataSnap II. Yöntem TFDBatchMove bileşenini kullanabilirsiniz. TFDBatchMoveDataSetWriter ve TFDBatchMoveDataSetReader bileşenleri yardımıyla bir dataset'ten veri alıp JSON yapısına dönüştürebilirsiniz. Örnek, 1- C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDBatchMove 2- DataSet Mapping to JSON III. Yöntem TFDMemTable datasetini kullanabilirsiniz. Örnek, Yeni Kaynak Kitabımızda Sayfa 748 - DataSet Yapısını JSON Formatına Dönüştürmek Yeni Kaynak Kitabımızda Sayfa 751 - JSON DataSet Yapısını DataSet Formatına Dönüştürmek Bunlar benim bildiklerim. Belki birkaç yöntem daha vardır. SQL de JSON Islemleri - adelphiforumz - 16-04-2019 Selamlar @"Fesih ARSLAN" hocam benim amacım direkt SQL Server üzerinden yapmaya çalışmak database içerisinde bir alanda JSON bilgi var bunu table olarak alıcam sonra bir işlem yapıcam ve tekrar geriye JSON olarak update edicem. Cvp: SQL de JSON Islemleri - Bay_Y - 16-04-2019 (16-04-2019, Saat: 00:42)adelphiforumz Adlı Kullanıcıdan Alıntı: Selamlar Bilgilendirme için çok teşekkürler. (16-04-2019, Saat: 11:48)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:(16-04-2019, Saat: 10:27)adelphiforumz Adlı Kullanıcıdan Alıntı: Tekrar Selamlar örneklendirme ve anlatım için çok teşekkür ederiz Fesih Bey. Cvp: SQL de JSON Islemleri - bydelphi - 21-06-2023 Json oluşturmak için Farklı bir Metotdda ben paylaşayım : tsql -> for json auto ile bir ihtiyaçtan hasıl olan 3 farklı tablodan iç içe geçmiş nested related child json object oluşturma kodunu örnekleyip paylaşıyorum. bu mantıkla çok daha fazla derinlikli json objectler de oluşturabilirsiniz. Önce tsql cursorlar ile yapayim dedim , sonra datasetlerle falan, ama bi yığın koda döngülere gerek yok diye daha sade olan bu birkaç satırlık sqli yazdım. Belki işinize yarar. önce test amaçlı ilişkisel örnek verimizi oluşturuyoruz. declare @t1 table ( ad varchar(30) ) insert into @t1 values ('abdullah') insert into @t1 values ('Emrah') insert into @t1 values ('Emrullah') declare @t2 table ( ad varchar(30) , yas int ) insert into @t2 values ('abdullah' ,30) insert into @t2 values ('abdullah' ,31) insert into @t2 values ('Emrah' ,40) insert into @t2 values ('Emrah' ,41) insert into @t2 values ('Emrullah' ,90) insert into @t2 values ('Emrullah' ,91) declare @t3 table ( ad varchar(30) , yas int , op int ) insert into @t3 values ('abdullah' ,30 , 300) insert into @t3 values ('abdullah' ,30 , 301) insert into @t3 values ('abdullah' ,30 , 302) insert into @t3 values ('abdullah' ,31 , 310) insert into @t3 values ('abdullah' ,31 , 311) insert into @t3 values ('abdullah' ,31 , 312) insert into @t3 values ('Emrah' ,40 , 401) insert into @t3 values ('Emrah' ,40 , 402) insert into @t3 values ('Emrah' ,41 , 403) insert into @t3 values ('Emrah' ,41 , 404) insert into @t3 values ('Emrullah' ,90 , 901) insert into @t3 values ('Emrullah' ,90 , 902) insert into @t3 values ('Emrullah' ,91 , 903) insert into @t3 values ('Emrullah' ,91 , 904) bu üstteki 3 tabloyu bağlayarak iç içe geçmiş 3 seviyeli nested related child json objectimizi oluşturuyoruz. select * from ( select t1.ad , ( select yas , ( select op from @t3 t3 where t3.ad = t2.ad and t2.yas = t3.yas for json auto, include_null_values ) child from @t2 t2 where t2.ad = t1.ad for json auto, include_null_values ) child from @t1 t1 ) q for json auto, include_null_values Sonuç : [ {"ad":"abdullah","child":[ {"yas":30,"child": [ {"op":300}, {"op":301}, {"op":302} ]}, {"yas":31,"child": [ {"op":310}, {"op":311}, {"op":312} ] } ] }, {"ad":"Emrah","child":[{"yas":40,"child":[{"op":401},{"op":402}]},{"yas":41,"child":[{"op":403},{"op":404}]}]}, {"ad":"Emrullah","child":[{"yas":90,"child":[{"op":901},{"op":902}]},{"yas":91,"child":[{"op":903},{"op":904}]}]} ] |