sql kayıt satır işlemlerinde kurallar belirlemek

Öncelikle kraulımızı kaydediyoruz.

CREATE RULE Rule_MinusControl
AS
@deger >= 0

Rule atama
Exec sp_bindrule Rule_MinusControl,'[dbo].[ContractDetails].Balance’

Rule kaldırma
Exec sp_unbindrule ‘[dbo].[ContractDetails].Balance’

ContractDetails.Balance değerine 0 ve küçük bir değer atanması durumunda sql belirlediğimiz kural için hata mesajı dönecek ve istenmeyen kayıtların eklenmesini engelleyecektir.

@@ROWCOUNT Kullanımı

@@rowcount komutu bize number değer döndürür. DML (Data Manipulation Language – select,insert,update,delete)işleminden etkilenen satirlarin toplam sayısını döndürür.
Bir update işlemi yaptık diyelim ki bunun sonucunda kaç tane satirin değiştiğini görmek isteyebiliriz.


Daha çok select into ile T-SQL içerisinde kullanılmaktadır.

sql sp_refreshview kullanımı

sp_refreshview ile View metadatalarını güncellemek için kullanılır.
SQL Server’da tüm tabloyu “select * ” listelediğimiz view’lerde kullanmış olduğumuz tablolara yeni kolon veya kolonlar eklendiğinde otomatik olarak “select * kullanımda bile” view’e eklenmez. View’e tabloya yeni bir kolon eklendiği bildirilmelidir.

Kullanmış olduğumuz View’e yeni kolonları eklemek için;

  • View’i Alter edebilir,
  • View’i drop-create edebilir,
  • sp_refreshview saklı yordamı ile metadata bilgilerini güncelleyebilirsiniz.

Bu üç yöntem arasında metadata bilgilerini sp_refreshview sistem saklı yordamını kullanmak en sağlıklısı olacaktır. Drop-create yönteminde view üzerinde yetkilendirmeler varsa silinecek ve tekrar yetki tanımlamanız gerekecektir.

Alıntıdır

with schemabinding,with encryption ve with check option ifadesi

With schemabinding view’in bağlı bulunduğu tablodaki kolonları kilitleyip o kolonların silinmesini engeller.

“Schemabinding” parametresini kullanırken dikkat edilmesi gereken iki önemli kuralı vardır:

  1. Birinci kural: Nesnemi oluştururken kullandığım kolonları  “Asterisk” (*) işareti ile belirtemem. Hangi kolonları koruma altına almak istiyorsam, kolonların adlarını yazarak belirtmeliyim.Gerekirse tüm kolonları koruma altına alacaksam hepsini “from” deyiminden önce yazmalıyım.
  2. İkinci kural: Nesnemi “schemabinding” ile oluştururken kullandığım tabloları “dbo” (database owner) anahtar sözcüğüyle kullanmam gerekiyor. “dbo” deyimine, “nesnenin ikinci kısmı” da denir. Veritabanı sahibi olduğumu belirtmeliyim. “Scalar Functions” nesneleri de ikinci kısımlarıyla çağrılması gerekiyordu.
  CREATE VIEW V_TEST
  WITH SCHEMABINDING
  AS
    SELECT [Id], [Ad], [Soyad] FROM dbo.Test

Bu durumda view’ın bağlı bulunduğu Test tablosundaki Id,Ad,Soyad kolonları silinemez, veri tipi ve kolon adı değiştirilemez hale gelir.

with encryption ifadesi ile viewleri,spleri,functionları şifreleyip sorguların görünür olmasını engeller

  CREATE VIEW V_TEST2
  WITH SCHEMABINDING, ENCRYPTION
  AS
    SELECT [Ad], [Soyad] FROM dbo.Test

Bu işlemden sonra artık yaratılan view içeriği görüntülenemez ve modify edilemez.

with check option
Kimi zaman view nesnelerini tanımlarken nesne gövdesinde WHERE elementi ile kısıtlamaya gidiyor olabilirsiniz. Peşi sıra; bu view nesnesini kullanarak tablolarınıza kayıt işlemi de gerçekleştirebilirsiniz. Şayet bu view nesnesi üzerinden sadece kısıta bağlı kayıt işlemi gerçekleştirecek isek böyle durumda WITH CHECK OPTION nesnesini kullanıyor olmamız gerekir.
Önemli Not1: WITH CHECK OPTION kullanılan nesnede bir transaction çalışır. Şayet ilgili view’de insert edilen satır view’de tanımlanan where koşuluna uyuyor ise insert işlemi başarılı şekilde çalışır aksi durum için yapılan insert işleminde transaction devreye girerek önce “insert” işlemi gerçekleşir sonrasında ise o satır “delete” edilir.
Önemli Not2: WITH CHECK OPTION kullanılan nesne kendisini bağlar, ilgili tabloyu bağlamaz. Yani tabloya bağımsız şekilde istediğiniz gibi kayıt etmeye devam edebilirsiniz.

CREATE VIEW vw_Adi
AS
SELECT * FROM tablo_adi WHERE kosul
WITH CHECK OPTION

SQL Join,Union,Except Nedir?

EXPECT: SQL’de EXCEPT ifadesini iki kümenin farklı elemanlarını getirmek için kullanırız. Sadece ilk sonuç setinde olup ikici sorgu sonucunda olmayan kayıtları listelememizi sağlamaktadır. Departman ve çalışanlar adında iki tablomuz olsun. Henüz bir departmana bağlı olmayan çalışanlar veya çalışanı olmayan departmanlar derken EXCEPT kullanabiliriz. Ya da sipariş ve müşteriler tablomuz olsun. Sipariş vermeyen müşterileri listelemek için de EXCEPT kullanabiliriz.

SELECT FilmStudioID FROM Studio
EXCEPT
SELECT FilmStudioID FROM film

EXCEPT’e alternatif olarak NOT IN’de kullanabiliriz. Aralarındaki fark; EXCEPT sonuçları DISTINCT getirirken, NOT IN tekrarlı/tekrarsız getirmektedir. Şimdi aynı örneği bir de NOT IN ile yazalım;

SELECT T1.StudioName, T1.FilmStudioID 
FROM Studio AS T1 
WHERE T1.FilmStudioID NOT IN
      (SELECT T2.FilmStudioID 
       FROM Film AS T2 
       WHERE T1.FilmStudioID=T2.FilmStudioID)

INTERSECT: SQL’de INTERSECT ifadesini iki kümenin ortak elemanlarını getirmek için kullanırız.

SELECT Sutun1, Sutun2...., SutunN FROM Tablo1
INTERSECT
SELECT Sutun1, Sutun2...., SutunN FROM Tablo2

UNION: 2 yada daha fazla SELECT ifadesini bağlar. JOIN ise iki ya da daha fazla tabloyu tek bir SELECT ile bağlar. Ayrıca UNION tablo satırlarını bağlar, JOIN ise tablo sütunlarını birleştirir.
SQL UNION/UNION ALL arasındaki fark nedir?
UNION: DISTINCT gibi davranır yani mükerrer(tekrar eden) kayıtlar gelmez.
UNION ALL: Mükerrer kayıt olup olmaması önemli değildir, tüm satırlar gelir.

Temelde üç tip JOIN vardır bunlar; CROSS JOIN, INNER JOIN ve OUTER JOIN (LEFT OUTER, RIGHT OUTER, FULL OUTER)‘dir.
CROSS JOIN: İki tablonun kartezyen çarpımıdır. Yani A tablosundaki her satır için B tablosundaki tüm satırlar döner.

--Önerilen syntax biçimi
SELECT Tablo1.Sütun(lar), Tablo2.Sütun(lar),
FROM Tablo1
 CROSS JOIN
     Tablo2
  
--Alternatif syntax biçimi
SELECT Tablo1.Sütun(lar), Tablo2.Sütun(lar),
FROM Tablo1, Tablo2

INNER JOIN: İki tablodaki ortak alana göre birebir eşleştirme yapar.

--Önerilen syntax biçimi
SELECT Tablo1.Sütun(lar), Tablo2.Sütun(lar),
FROM Tablo1
 INNER JOIN
     Tablo2 ON
   Tablo1.Ortak_Sütun = Tablo2.Ortak_Sütun

LEFT OUTER JOIN: İlk tablonun verileri koşulsuz gelir, ikinci tablodan ise ortak alana göre eşleşen kayıtlar gelir. Eşleşmeyen kayıtlar NULL döner.

--Önerilen syntax biçimi
SELECT Tablo1.Sütun(lar), Tablo2.Sütun(lar),
FROM Tablo1
 LEFT OUTER JOIN
     Tablo2 ON
   Tablo1.Ortak_Sütun = Tablo2.Ortak_Sütun

RIGHT OUTER JOIN: İkinci tablonun verileri koşulsuz gelir, ilk tablodan ise ortak alana göre eşleşen kayıtlar gelir. Eşleşmeyen kayıtlar NULL döner.

SELECT Tablo1.Sütun(lar), Tablo2.Sütun(lar),
FROM Tablo1
 RIGHT OUTER JOIN
     Tablo2 ON
   Tablo1.Ortak_Sütun = Tablo2.Ortak_Sütun

FULL OUTER JOIN: İki tablonun ortak alana göre eşleşen eşleşmeyen tüm kayıtları gelir. Eşleşmeyen kayıtlar NULL döner.

SELECT Tablo1.Sütun(lar), Tablo2.Sütun(lar),
FROM Tablo1
 FULL OUTER JOIN
     Tablo2 ON
   Tablo1.Ortak_Sütun = Tablo2.Ortak_Sütun

sp_helptext, sp_columns, sp_tables System Prosedürünün kullanılması

sp_helptext prosedürü bizim tanımladığımız yada sistemde bulunan objelerin tanımlamalarını text formatında gösterir.
ÖR: exec sp_helptext ‘TBLREFERANSLAR’

sp_columns belirtilen tablonun kolonlarını, tiplerini vs detaylı listeler.
exec sp_columns ‘TBLREFERANSLAR’

sp_tables tüm tabloların veya belirtilen tabloyu detaylı listeler.
exec sp_tables ‘TBLREFERANSLAR’ –Sadece TBLREFERANSLAR tablosunu detaylı getirir.
exec sp_tables –Tüm tabloları listeler.

SQL Server da Temporary Tablo Kullanımı

Sql Server’da 2 temp tablo türü oluşturulabilir.
Bunlar;

  • Local Temp Tablo
  • Global Temp Tablo

Local Temp Tablo

Local Temp tablolar sadece tabloyu olusturan kullanicinin, olusturmak için kullandigi connection üzerin de geçerlidir. Kullanici baglantiyi kapattigi anda otomatik olarak silinir. Local Temp tablo tanimlamak için tablo isminin önüne # isareti koymamiz yeterlidir.

CREATE TABLE #LocalTempTablo
(
    ID int,
    Ad varchar(20), 
    Soyad varchar(20)
)
 
insert into #LocalTempTablo values ( 1, 'TEST','MEST');
 
select * from #LocalTempTablo 
 
Yukariki scriptleri çalistirdiktan baska bir sorgu penceresinde select veya insert sorgusu çalistirirsaniz asagidaki hatayi alirsiniz.
Msg 208, Level 16, State 0, Line 1
Invalid object name '#LocalTempTablo'

Global Temp Table

Global olarak temp tablo tanimlamak için ## karakterlerini tablo isminden önce eklememiz yeterlidir. Global temp tablolar bir connection içinde tanimlandigi anda, normal tablolar gibi tüm kullanicilar ve connectionlar içinde kullanilabilir hale gelirler. Global tabloyu olusturdugunuz connection kapatilana kadar bu tablo var olmaya devam eder.

CREATE TABLE ##LocalTempTablo
(
    ID int,
    Ad varchar(20), 
    Soyad varchar(20)
)
 
insert into ##LocalTempTablo values ( 1, 'TEST','MEST');
 
select * from ##LocalTempTablo 
 
Yukaridaki select ve insert sorgusunu istediginiz herhangi bir sorgu ekraninda çalistirabilirsiniz. Ilk olusturdugunuz connection açik oldugu sürece heryerden bu tablolara erisim yapilabilir. Temp tabloyu oluşturduğunuz pencereyi kapattığınızda ise yine aşağıdaki hatayı alırsınız.
Msg 208, Level 16, State 0, Line 1
Invalid object name '#LocalTempTablo'

 

SQL SERVER’DA LINKED SERVER(OPENQUERY) KULLANIMI

Sql serverda tek sorgu cümlesi üzerinden birden fazla Sql server’a bağlanıp veri getirmek istediğiniz anda SQL Server Linked Server” yardımınıza koşuyor.

Linked Server bağlantısının nasıl yapıldığını google ile kolayca bulabilirsiniz. Başarıyla tanımladığınızı farz ederek devam ediyorum.
Linked Server : istediğiniz herhangi bir bağlantı ismi. Ör(192.168.0.13)

Aşağıdaki sorgu ile uzaktaki database’den KULLANICILAR tablosuna select çekilmektedir.

select * from OPENQUERY([192.168.0.13],'select * from TEST.dbo.KULLANICILAR')

Select into ile uzaktaki KULLANICILAR tablosunu databasemizde YENI_KULLANICILAR tablosu olarak oluşturmaktyız.

select AD,SOYAD into YENI_KULLANICILAR from 
openquery([192.168.0.13],'select * from LOJITEK.dbo.KULLANICILAR') 

Bu işlemler isteğe göre çoğaltılabilir.

Inner join ile update sorgusu

KULLANICI tablosunda ADSOYAD boş olan kayıtlar için ESKI_KULLANICI tablosundaki ADSOYAD ile günceller.

UPDATE KULLANICI 
SET KULLANICI.ADSOYAD = ESKI_KULLANICI.ADSOYAD 
FROM NEW_KULLANICI AS KULLANICI 
INNER JOIN OLD_KULLANICI AS ESKI_KULLANICI 
       ON KULLANICI.KIMLIKNO = ESKI_KULLANICI.KIMLIKNO 
WHERE KULLANICI.ADSOYAD is null 

SQL Tam Addan İsim ve Soyisimi ayırma

Veri tabanında FullName olarak tutulan alanı Name,Surname Olarak listeletmemiz gereken durumlar olabilir. Bunun için aşağıdaki kodu kullanabilirsiniz. İsim ve soyisimi ayırmak için tamadda boşluk varmı kontrolü yapıyoruz ve buna göre ayırıyoruz.

SELECT
(
 CASE WHEN CHARINDEX(' ', FULLNAME) > 0 THEN SUBSTRING (FULLNAME, 1, CHARINDEX(' ', FULLNAME)-1 )
 WHEN LEN(FULLNAME) > 0 THEN FULLNAME
 ELSE 'İSİM' END
) AS AD,
ISNULL(SUBSTRING (FULLNAME, CHARINDEX(' ', FULLNAME) + 1, len(FULLNAME)),'SOYAD') AS SOYAD
FROM KULLANICILAR