CBS Etiketli Yazılar

SQL Server 2008 – Yeni Veri Tipleri

SQL Server 2008 ile birlikte gelen yeniliklerden biride, yeni veri tipleridir. Bu yenilikler sayesinde, önceki SQL Server versiyonlarında var olan veri tiplerini kullanarak saklayamadığımız veya saklamakta zorlandığımız verilerimiz için uygun çözümleri artık bulabilmekteyiz.

SQL Server 2008 ile birlikte gelen yeni veri tiplerini beş ana başlıkta toplayabiliriz.

A- DATE-TIME (Yeni tarih ve Saat veri tipleri)

– DATE
– TIME
– DATETIME2
– DATETIMEOFFSET

B- SPATIAL (Uzaysal Veri Tipi)
GEOMETRY
GEOGRAPHY

C- HIERARCHYID (Hiyerarşik Veri Tipi)

D- FILESTREAM (Dosya Veri tipi)

E- USER-DEFINED TABLE TYPE (Kullanıcı Tanımlı Tablo Tipi)

Bu beş ana başlığı detaylı olarak ve örneklerle incelemeye çalışacağız.

A- DATE-TIME (Yeni tarih ve Saat veri tipleri)
Önceki SQL Server sürümlerinde kullandığımız “datetime” ve “smalldatetime” veri tipleri Tarih ve Saat bilgilerini birlikte barındırmak zorunda olan ve kısıtlamalar içeren tiplerdi.
Nedir bu kısıtlamalar?

– Tarih ve Saat bilgisinin birlikte tutulmak zorunda olması ve bundan dolayı istenmeyen verinin de yer işgal etmesi. Veriyi çekerken convert etmek zorunda kalmamız ve doğal olarak bunun sorgu performanslarını düşürmesi.

– 01.01.1753 öncesi tarihleri reddetmesi.

– 3.333 milisaniyeden küçük zaman dilimlerinin saklanamaması.

– “Zaman dilimi” bilgisini tutmadığı için buna ihtiyaç duyulması halinde uygulama tarafında ekstra kodlama gerektirmesi.

Bu kısıtlamalar başta finansal ve bilimsel uygulamaların veri tabanlarının tasarlanması olmak üzere güçlük oluşturuyordu. Bu güçlükler, SQL Server 2008 ile gelen, yeni DATE ve TIME veri tipleriyle çözüme kavuşmuştur.

DATE Veri Tipi: Yalnız tarih bilgisini (gün, ay, yıl) barındırır. 01-01-0001 ile 31-12-9999 Aralığında değer alabilir. Toplam 3 byte yer kaplar.

Veri tipini örnek bir sorgu ile inceleyelim:

DECLARE @tarih DATE
SET @ tarih =GETDATE()
SELECT @ tarih

Result:
2010-03-22

TIME Veri Tipi: TIME(n) tipi, Saat, dakika, saniye ve salise (7 digitlik hassasiyet ile) bilgilerini tutuyor.”n” salise hassasiyetini belirtir ve 0 -7 arası değer alabilir.
Yani Time(n) in alabileceği değerler 00:00:00.0000000 ile 23:59:59.9999999 arasındadır. SQL Server 2005 de ise saliseyi en fazla 3 digit olarak kullanabiliyorduk.

Veri tipi için örnek bir sorgu :

DECLARE @zaman TIME
SET @zaman=GETDATE()
SELECT @zaman

Result:
12:00:01.1234999

Örnekte görüldüğü gibi TIME tipli değişkenin “n” parametresi belirtilmediğinde varsayılan olarak 7 değerini alıyor.

Eğer salise olmasın istiyorsanız;

DECLARE @zaman TIME(0)
SET @zaman=GETDATE()
SELECT @zaman

Result:
12:07:07

şeklinde kullanmalısınız.

DATETIME2 Veri tipi: Tarih ve Saati birlikte tutabileceğimiz veri tipidir. MSSQL 2005 de kullandığımız DATETIME tipinden den iki farkı vardır.
– Salise hanesini 7 digit hassasiyetle tutulabilir.
– Tarih değeri 1 Ocak 0001 – 31 Aralık 9999 arasında değer alabilir.

ANSI SQL Standartlarındadır ve .NET de kullandığımız Datetime tipiyle de uyumludur. Hassasiyet derecesine göre 6 ile 8 byte arasında yer kaplar. Bu veri tipini 2005 den geçiş tipi olarak düşünebiliriz.

Örnek: Salise hassasiyeti 4 olarak ayarlandı.

Declare @Tarih DATETIME2(4)
SET @ Tarih =GETDATE()
SELECT @ Tarih

Result:
2010-04-0105:23:12.0292

DATETIMEOFFSET Veri tipi: DATETIME2 tipi ile aynı özellikleri taşır. Tarih ve zaman bilgisi, coğrafi zaman dilimi esas alınarak tutulur.

Dünyanın farklı yerlerinde, aynı andaki zaman bilgisini eşgüdümlü olarak ifade etmek için U.T.C deyimi kullanılır. U.T.C İngiltere’de Greenwich’ten geçen meridyen referans kabul edilerek hesaplanır.

Türkiye Doğu Avrupa Zaman Dilimi’ndedir; bu yüzden Türkiye saati UTC+2, yani UTC’ den iki saat ileridedir. Fakat yaza doğru saatlerin bir saat ileri alınmasıyla Türkiye saati UTC+3 olur.

DATETIMEOFFSET veri tipi verilerin global olarak hangi saatte oluştuğunu takip edebilmemiz açısından özellikle uluslararası kullanımın söz konusu olduğu projelerde kullanılmak üzere önemli bir kolaylık getirmektedir.

DATETIMEOFFSET veri tipi, YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm formatında girilir ve veri boyutu 8-10 byte dır.

SQL Server 2008 ile birilikte, yeni tarih-zaman veri tipleriyle birlikte 5 adet de yeni fonksiyon gelmiştir. Bu fonksiyonlardan SYSDATETIMEOFFSET() fonksiyonu UTC ye göre yerel tarih ve saat bilgisini döndürür.

Örnek bir sorgu ile fonksiyonumuzu test edelim:

SELECT SYSDATETIMEOFFSET() AS 'Tarih,Saat ve Time Zone'


Diğer yeni fonksiyonlarımız ise:

SYSDATETIME: Anlık Tarih ve zaman bilgisini DATETIME2 formatında döndürür.

Select SYSDATETIME()

Result:
2010-04-02 01:30:57.8837264

SYSUTCDATETIME: UTC zamanını DATETIME2 formatında döndürür.

SELECT SYSUTCDATETIME() UTC

Result:
2010-04-01 22:31:10.6217264

Görüldüğü gibi 01:31de çalıştırılan sorgu 3 saatlik fark ile geri döndü.(UTC +3)

SWITCHOFFSET
: Bir tarih ve zamanı başka bölge tarih ve zamanına çevirmek için kullanılır. Giriş tarih formatın da ofset bilgisinin bulunması zorunludur.

Örnek olarak İzmir yerel saati ile 18.00 da kalkan İzmir-London uçağının, Londra yerel saati ile kalkış saatini bulmak için;

DECLARE @izmirkalkis DATETIMEOFFSET='2010-04-01 18:00 +00:00'
SELECT @izmirkalkis as 'İzmir Kalkış Saati',
SWITCHOFFSET(@izmirkalkis,'-02:00')as 'Londra saati ile kalkış zamanı'

TODATETIMEOFFSET: ilk Parametre olarak girilen tarihe, ikinci parametre olarak girilen ofset değeri ilave eder.

SELECT TODATETIMEOFFSET(SYSDATETIMEOFFSET(), '-05:00')

Result:
2010-04-02 01:47:23.5887264 -05:00

Tüm Tarih Saat Tiplerine ait özet tablo aşağıdadır.

B- SPATIAL (Uzaysal Veri Tipi)
SQL Server 2008 ile gelen en güzel yeniliklerden biride artık mekânsal verilerin de saklanabiliyor olmasıdır.

Spatial veri tipi ikiye ayrılır.

Geometry: Geometri veri tipi, düzlemsel (2 Boyutlu) bilgileri tutmakta kullanılır.

Geography: Coğrafi veri tipi, Dünya yüzeyine ait bilgileri tutmakta kullanılır.

Her iki veri tipide .NET CLR (Common Language Runtime) desteklidir.Geometri veri türü, Open Geospatial Consortium (OGC) tarafından belirlenmiş SQL Specification versiyon 1.1.0 standartlarına uygun olarak çalışır. Bu standartlar ile ilgili teknik detaylara, konsorsiyuma ait;
OGC Specifications, Simple Feature Access Part 1 – Common Architecture
OGC Specifications, Simple Feature Access Part 2 – SQL Options
linklerinden erişebilirisiniz.

Spatial veri tiplerinde veriler binary olarak tutulmaktadır. Text formata, OGC tarafından belirlenmiş WKT (Well Konown Text ) formatı ile dönüşmektedirler.

Örnek WKT Formatları:

POINT(6 10)
LINESTRING(3 4,10 50,20 25)
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2))
MULTIPOINT(3.5 5.6,4.8 10.5)
MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))
GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))

Geometry ve Geography veri tipleri on bir veri nesnesi içerir ve bunların yedisi somut olarak ifade edilir. Diğer 4 nesne ise esasta soyuttur. Aşağıdaki grafik de sarı renkli soyut objelere, ifade edildikleri somut mavi objeler üzerinden ok çekilmiştir ve grafik bu on bir obje arasındaki hiyerarşiyi göstermektedir.

Veri nesnelerini detaylı olarak incelemeden önce, örneklerde kullanacağımız, SQL Server 2008 ile gelen Spatial veri tipi fonksiyonlarının bir kısmına göz atalım:

STGeomFromText: WKT formatındaki değerin,geometrik değerini oluşturur.

STAsText: WKT formatındaki değeri döndürür.

STGeometryN: Multi destekli veri nesneleri içersindeki n. Nesne bilgisini döndürür.

STIntersection: İki nesne kesişimini yeni bir nesne olarak döndürür.

STArea: Toplam alanı döndürür.

STUnion: İki Geometrik nesnenin birleşimini döndürür.

STSymDifference: Bir geometrik nesnenin başka bir nesne ile kesişmeyen kısmını döndürür.

STSrid:  SRID değerini alır.

STIntersects: İki örneğin kesişip kesişmediği bilgisini verir.

STGeometryType: Değerin WKT adını döndürür.

STTouches: İki geometrik nesne kesişiyor ise 1 değerini aksi durumda 0 değerini döndürür.

STWithin: Belirtilen nokta, Geometrik cisim içerisinde kalıyor ise 1 değilse 0 değerini döndürür.

GeomFromGML: Nesne bilgisini Geography Markup Language (GML) formatında döndürür.

AsGML: GML formatında,geometrik değeri alır.

STLength: Bir çizginin uzunluğunu verir.

STDistance: İki nokta arasındaki en kısa mesafeyi döndürür.

(Not: Fonksiyon isimlerinin büyük-küçük harf duyarlı olduğunu unutmayalım.)

Spatial fonksiyonlar SRID parametresini içerirler. SRID (spatial reference identifier), işlemin hangi spatial referans sistemine göre uygulanacağını belirten integer tipinde bir değerdir ve geometry veri tipinde 0, geography veri tipinde ise 4326 (WGS 84 spatial reference system) default SRID değerleridir.

4326 (WGS 84) SRID içeriği:
GEOGCS[“WGS 84”, DATUM[“WGS_1984”, SPHEROID[“WGS 84”,6378137,298.257223563, AUTHORITY[“EPSG”,”7030″]], AUTHORITY[“EPSG”,”6326″]], PRIMEM[“Greenwich”,0, AUTHORITY[“EPSG”,”8901″]], UNIT[“degree”,0,01745329251994328, AUTHORITY[“EPSG”,”9122″]], AUTHORITY[“EPSG”,”4326″]]

SQL Server 2008 de tanımlı tüm SRID kod ve referans değerlerine göz atmak istersek aşağıdaki sorguyu kullanabiliriz.

Select * from sys.spatial_reference_systems

Veri nesnelerini örneklerle inceleyelim;

Point:
Nokta, 0 boyutludur. “POINT (X Y Z M)” Formatında kullanılır. X ve Y Koordinat bilgisidir. Z (yükseklik) ve M (ölçü) değerleri opsiyonel parametrelerdir ve herhangi bir hesaplamada kullanılmamaktadırlar.

Aşağıdaki Örnekte, Geometry veri tipinde @g değişkeni tanımlıyoruz ve WKT formatındaki (X=9,Y=4,SRID=0) veriyi “STGeomFromText” fonksiyonu ile geometrik formata çevirip, tanımladığımız değişkene atıyoruz.

DECLARE @g geometry
SET @g = geometry::STGeomFromText('POINT (9 4)', 0);
Select @g

Result
0x00000000010C00000000000022400000000000001040

Görüldüğü gibi sonuç binary olarak dönmektedir. SQL Server 2008 ile birlikte (Spatial Sorgularda) artık “Spatial Result” tabı da oluşmaktadır. Bu sorgunun Spatial Result tabındaki görüntüsü ise:

X=9, Y=4 Koordinatında oluşan noktayı görüyoruz.

Aynı işlemi opsiyonel alanlarımızı da ilave ederek ve SRID default değeri (0) ile tanımlayalım ve parse ettiğimiz değerleri gösterelim:

DECLARE @g geometry;
SET @g = geometry::Parse('POINT(3 4 7 2.5)');
SELECT @g.STX as X,@g.STY as Y,@g.Z as Z, @g.M as M;

Result:

MultiPoint: Dizi halinde birden fazla Point içeren geometrik nesnedir.

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT((0.1 2), (0.2 2) ,(0.3 2),(10 5))', 0);
Select @g

Dizi içerisinde ki Pointlerden 2. Sıradakini bulmak için;

SELECT @g.STGeometryN(2).STAsText();

Result:
POINT (0.2 2)

•LineString: İki nokta arasındaki en kısa yoldan çekilen çizgiyi temsil eden geometrik nesnedir. Tek boyutludur, kullanımı ile halka oluşumu söz konusu olsa da hiçbir zaman bir alan oluşturmaz.

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(1 1, 3 6, 1 5)', 0);
Select @g

Spatial Result

•MultiLineString: LineString nesnesinin çoklu olarak kullanımıyla oluşan nesne dizisidir.

DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((1 2, 3 4), (3 2, 5 4))');
Select @g

Spatial Result

•Polygon: Çokgen, iki boyutludur, uzunluk ve alan içerir.

DECLARE @g geometry;
SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);
Select @g

Spatial Result

•MultiPolygon: Polygon nesnesinin çoklu olarak kullanımıyla oluşan nesne dizisidir.

DECLARE @g geometry;
SET @g = geometry::Parse('MULTIPOLYGON(((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), ((4 4, 4 5, 5 4, 4 4)))');
Select @g

Spatial Result

•GeometryCollection: Tüm geometry veya geography örneklerini taşıyabilen ve boş olabilen koleksiyondur.

DECLARE @g geometry;
SET @g = geometry::STGeomCollFromText('GEOMETRYCOLLECTION(POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))', 1);
SELECT @g

Spatial Result

Böylece tüm türleri tamamlamış olduk. Yaptığımız örneklerde geometry tipini kullanmış olsak da bu örnekler geography tipine de yapı olarak uymaktadır. Aralarındaki temel fark geometry tipinin Euclid düzleminde, geography tipinin ise geodetik düzlemde(dünya yüzeyini dikkate alarak) işlem görmesidir. Geography tipi, noktaların enlemsel ve boylamsal bilgilerini GPS(Global Positioning System) koordinatlarına göre tutar. Geography tipinde SRID olarak 4326 kullanıyoruz. Geography tipini kullanarak birkaç örnek uygulayalım.

Geography tipinde bir poligon çizelim:

DECLARE @g geography;
SET @g = geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326);
SELECT @g

Spatial Result

İki poligonun birleşimini alalım:

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326);
SET @h = geography::STGeomFromText('POLYGON((-122.351 47.656, -122.341 47.656, -122.341 47.661, -122.351 47.661, -122.351 47.656))', 4326);
SELECT @g.STUnion(@h)

Spatial Result

Mekânsal veri tiplerini ne tür uygulamalarda kullanabiliriz? Örnekler vermek gerekirse; Yer belirleme sistemleri, Kent Bilgi Sistemi, Karayolları uygulamaları, Arazi Bilgi Sistemi, Tapu ve Kadastro Bilgi Sistemi, Lojistik ve Depolama Bilgi Sistemleri, İç Güvenlik Bilgi Sistemi, Araç Takip Bilgi Sistemi, Trafik Bilgi Sistemi, Kampus Bilgi Sistemi. Afet Yönetim Bilgi Sistemi, Harita Bilgi Sistemi, vb. En geniş kapsamda ise tüm işletmeler için, karar verme süreçlerinde önemli yer tutan, müşteri, bayi, mağaza ve rakip firma ve mağazalarının, nerede olduğunu ve nerelerde yoğunlaştığının görselleştirilmesi gibi projelerde ihtiyaç duyulacak veri tipleridir.

Yaygın GIS yazılımlarına baktığımızda büyük çoğunluğunun SQL Server 2008 ‘i son versiyonların da desteklediğini görüyoruz.Microsoft Spatial Partnerleri listesi için;
http://www.microsoft.com/sqlserver/2008/en/us/spatial-partners.aspx
linkinden detaylı bilgiye ulaşabilirsiniz.Ülkemizde uygulamaları yaygın olarak kullanılan GIS Yazılım firmalarının da bu listede olduğunu belirtmek isterim.

Bu konu aslında birazda coğrafi bilgi sistemleri alanında uzmanlık isteyen bir konu ve bu makalede burada bırakıyoruz. Spatial veri tipleri hakkında daha detaylı bir makale ile daha sonra devam edebiliriz.

Aşağıdaki maddelere yakın bir zamanda devam edeceğiz.

C- HIERARCHYID (Hiyerarşik Veri Tipi)

D- FILESTREAM (Dosya Veri tipi)

E- USER-DEFINED TABLE TYPE (Kullanıcı Tanımlı Tablo Tipi)

….

..

.