Selamlar,
Bugün SQL Server 2016 ile hayatımıza girmiş olan ( COMPATIBILITY_LEVEL = 130 ve üstü ) OPENJSON kullanarak bir web sitesinde yer alan json çıktısını nasıl işleyebilirizi ele alacağız.
İlk adım olarak Web sayfasındaki veriyi almamızı sağlayacak sql server function yazıyor olacağız fakat function içerisinde kullandığımız OLE objelerinden dolayı öncelikli olarak aşağıdaki kod bloğu ile SQL Server’da OLE objelerinin kullanıma açmamız gerekiyor.
sp_configure 'show advanced options',1 Reconfigure go sp_configure 'Ole Automation Procedures',1 reconfigure
OLE objelerini kullanıma açtığımıza göre aşağıdaki kod bloğu ile Web sayfasını okuyacağımız SQL Function yazalım.
create function dbo.GetWebPage( @WebPage varchar(max)='') RETURNS varchar(max) as BEGIN DECLARE @url VARCHAR(MAX), @win INT, @hr INT, @Text VARCHAR(8000), @RowID int, @Status smallint, @Accuracy tinyint Set @url = @WebPage EXEC @hr = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @win OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo @win EXEC @hr = sp_OAMethod @win, 'Open', NULL, 'GET', @url, 'false' IF @hr <> 0 EXEC sp_OAGetErrorInfo @win EXEC @hr = sp_OAMethod @win, 'Send' IF @hr <> 0 EXEC sp_OAGetErrorInfo @win EXEC @hr = sp_OAGetProperty @win, 'ResponseText', @Text OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo @win EXEC @hr = sp_OADestroy @win IF @hr <> 0 EXEC sp_OAGetErrorInfo @win return @Text END
SQL Function da tamamlandığına göre Döviz değerlerini işleyeceğimiz tablomuzu oluşturalım.
create table DovizChangeHistory ( ID int identity(1,1) primary key, CurrencyName varchar(100), Selling decimal(10,5), Buying decimal(10,5), Change_rate varchar(50), InsertDate datetime not null default(getdate()) )
Nihayet son aşamaya geldik, bu aşamada ise hangi adresten veriyi çekeceğimizi bir değişken ile gösteriyoruz ve gelen değerin JSON formatında olup olmadığını kontrol edip uygunsa tabloya değerleri yazıyoruz. Yoksa ekrana uyarı veriyoruz.
declare @LinkUSD varchar(max) = 'https://www.doviz.com/api/v1/currencies/USD/latest' declare @USD_Validate bit declare @JSON varchar(max) select @JSON= dbo.GetWebPage(@LinkUSD) select @USD_Validate = ISJSON(@JSON) if (@USD_Validate = 1) BEGIN insert into DovizChangeHistory(CurrencyName,Selling,Buying,Change_rate,InsertDate) select full_name as CurrencyName , selling as Selling, buying as Buying, change_rate Change_rate, getdate() as InsertDate from OPENJSON(@JSON) WITH ( full_name varchar(100), selling decimal(10,5), buying decimal(10,5), change_rate varchar(50) ) END else BEGIN select 'JSON Formatı Uygun değil!' END
İşlemleri tamamladıktan sonra Tablomuzu kontrol ettiğimizde aşağıdaki gibi history durumu ile karşılaşabiliriz.
select * from DovizChangeHistory
Bir yazımızın daha sonuna geldik, içeriği daha da geliştirebilmek adına isterseniz SQL Server Agent da JOB oluşturup son scripti kullanabilirsiniz . Sorunuz olursa buradayım!
Merhabalar Çağlar Bey,
Mevcut Yapımız Üzerinde SQL Server 2014 Kullanılmaktadır, Anlatmış Olduğunuz Makale Üzerinde COMPATIBILITY_LEVEL 120 Olarak Nasıl Kullanabilirim ?
Ayrıca Sadece USD Değil de Diğer Tüm Döviz Kurları İçin Nasıl Bir İşlem Yapabilirim ?
Sizlerden Bilgi Beklemekteyim, İyi Çalışmalar…
Merhaba Halil İbrahim Bey,
JSON Özelliğini kullanabilmeniz için SQL Server 2016 versiyonuna sahip olmanız gerekiyor. Bu sebepten kullandığınız SQL Server 2014’ü upgrade edecek olursanız bu özelliği kullanabilirsiniz. Compability level değiştirme işlemi için aşağıdaki syntaxı kullanabilirsiniz.
alter database DBNAME set COMPATIBILITY_LEVEL = 130;