Konuyu Oyla:
  • Derecelendirme: 4.5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
SQL de JSON Islemleri
#1
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/rel...erver-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 Path
yada
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
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#2
Ellerinize sağlık.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
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
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#4
(16-04-2019, Saat: 10:27)adelphiforumz Adlı Kullanıcıdan Alıntı: 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

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.  Smile
Cevapla
#5
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.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#6
(16-04-2019, Saat: 00:42)adelphiforumz Adlı Kullanıcıdan Alıntı: 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/rel...erver-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 Path
yada
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

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
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

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.  Smile


örneklendirme ve anlatım için çok teşekkür ederiz Fesih Bey.
Cevapla
#7
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}]}]}
]

Sorsaydı Bilirdi Sormuyor ki Bilsin.
Bilseydi Sorardı Bilmiyor ki Sorsun. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  MSSQL Data downgrade (Alt sürüme veri aktarma) işlemleri adelphiforumz 0 503 23-03-2023, Saat: 11:13
Son Yorum: adelphiforumz
  SQL 2014 ve Öncesi için JSON Parse konusunda yardım adelphiforumz 2 1.114 08-07-2022, Saat: 11:40
Son Yorum: hi_selamlar
  MSSQL Network Uzerine Backup ve Restore işlemleri adelphiforumz 5 3.663 19-03-2020, Saat: 13:39
Son Yorum: adelphiforumz



Konuyu Okuyanlar: 1 Ziyaretçi