sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

10 Ocak 2019 Perşembe

SQL Server da Window Fonksiyonların Kullanımı

SQL Server da  daha hızlı ve anlaşılır hesaplama yapmak için window function ların nasıl kullanıldığına dair yazıma  buraya tıklayarak ulaşabilirsiniz.

26 Nisan 2010 Pazartesi

Excel'den SQL Server'a Veri Okuma

Excel'den SQL Server'a data okumak için kullanılacak birçok yöntem var.


Eğer excel'den okuyacağımız data, tek bir tablo içine eklenecek veya tek bir tabloyu güncelleyecek ise en çok kullandığım ve bana en pratik gelen yöntem ise, excel de sql script ini oluşturmak ve bunu çalıştrmak.


Test etmek için basit bir tablo oluşturalım ve içine birkaç kayıt ekleyelim.



CREATE TABLE Musteri(MusteriNo int identity(1,1) primary key,
                     AdSoyad varchar(100), Adres varchar(100),
                     Ilce varchar(30), Il varchar(30),DogumTarihi datetime)
GO
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES
('Deneme 1','Adres 1','Ilce 1', 'Il 1','1975-10-11'),
('Deneme 2','Adres 2','Ilce 2', 'Il 2','1980-01-01')


Şimdi de bir excel dosyamız olsun ve excel dosyasındaki kayıtları bu tabloya ekleyecek script'i oluşturalım.

="INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('" & A2 & "','" & B2 & "','" & C2 & "','" & D2 & "','" & TEXT(E2;"yyyy-aa-gg") & "')"

Burada dikkat edilecek 2 nokta var. 1. si karakter verileri tek tırnak (') içine almak, 2. ise, tarih tipindeki verileri formatlamak.
Bunun için de Text fonksiyonunu kullandım ve "yyyy-aa-gg" formatında gelmesini istedim. Bu sql server'ın herhangi bir convert işlemi yapmayı gerektirmeden kolaylıkla anladığı tarih formatı. 15 Şubat 2010 tarihi bu format ile '2010-02-15' şeklinde görünecek.


Formülü oluşturduktan sonra tek yapmam gereken F2 hücresini tutup aşağı doğru çekmek ve oluşan script'i bir SQL IDE'sine kopyalamak.

INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 3','Adres 3','Ilce 3','Il 3','1974-12-15')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 4','Adres 4','Ilce 4','Il 4','1966-08-10')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 5','Adres 5','Ilce 5','Il 5','1976-05-27')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 6','Adres 6','Ilce 6','Il 6','1980-05-12')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 7','Adres 7','Ilce 7','Il 7','1966-02-01')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 8','Adres 8','Ilce 8','Il 8','1978-12-03')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 9','Adres 9','Ilce 9','Il 9','1972-07-05')
INSERT INTO Musteri(AdSoyad, Adres, Ilce, Il,DogumTarihi) VALUES('Deneme 10','Adres 10','Ilce 10','Il 10','1979-10-10')

23 Eylül 2008 Salı

Satırlardaki Bilgileri Kolonlarda Birleştirme (Transpose)

Bir değişken tablo tanımlayalım ve bu tabloya 3 satırlık data ekleyelim.. Amacımız bu satırları tek bir satırda, araları "," ile ayrılmış olarak göstermek


DECLARE @Multiple TABLE(TestColumn varchar(20))

INSERT INTO @Multiple

SELECT 'Test 1'

UNION SELECT 'Test 2'

UNION SELECT 'Test 3'

SELECT * FROM @Multiple

Tüm tabloyı çekersek aşağıdaki kayıt setini görebiliriz.

TestColumn

Test 1

Test 2

Test 3

Aslında özel birşey yapmıyoruz. FOR XML PATH'in xml tag leri yaratmasını ve aynı xml tag'ine alacağı satırları birleştirmesi özelliğini kullanıyoruz.

SELECT ', ' + TestColumn FROM @Multiple FOR XML PATH('')

Yukarıdaki sql cümlesi bize şöyle bir sonuç üretecek:

, Test 1, Test 2, Test 3

Şimdi de en baştaki ", " u stuff fonksiyonunu kullanarak kaldıralım.

SELECT isNull(Stuff((SELECT ', ' + TestColumn FROM @Multiple FOR XML PATH('')),1,2,''),'')

İşte sonuç :
Test
1, Test 2, Test 3

Tetikleyicileri devre dışı bırakmak / devreye almak (DISABLE/ENABLE Trigger)

Bazen öyle durumlar oluyor ki, geçici olarak SQL Server da yazdığımız tetikleyici(trigger)ları devre dışı bırakmak, geçici olarak çalışmamasını sağlamak gerekebiliyor.

Eskiden, trigger'ın koduna girer, en başına return yazarak triggerın çalışır çalışmaz hiç bir iş yapmamasını sağlamış olurdum. Bu triggerın ismini de bir yere not eder, tekrar devreye almak istediğimde kodu değiştirirdim.. Eğer bu notu kaybedersem (ki jira dan önce başıma gelen birşeydi bu) tüm trigger scripleri içerisinde return aratır ve gereksiz bir sürü trigger koduna bakmak zorunda kalırdım..
Daha önceki versiyonlarında var mıydı bilmiyorum ama SQL Server 2005 ile keşfettiğim bir SQL kodu var. ENABLE/DISABLE TRIGGER [myTriggerName] ON [myTableNameName]

Önce örnek bir tablo ve o tabloya ait bir trigger yazalım :

CREATE TABLE TestTablo1(ID int identity(1,1),Name varchar(255))
GO
CREATE TRIGGER trTestTrigger1 ON TestTablo1 AFTER UPDATE,INSERT,DELETE
AS BEGIN
select 'triggerdan gelen inserted' as note, * from inserted
select
'triggerdan gelen deleted' as note, * from deleted
END

GO

Bu trigger, sadece test amaçlı yazıldığı için özel bir iş yapmıyor. Sadece trigger lar içerisinden ulaşılabilen ve yeni kayıtları (update ise verilerin yeni halini) gösteren inserted tablosundaki tüm satırları ve silinen (update işleme ise verilen eski halini) gösteren deleted tablosundaki tüm kayıtları getiriyor.

Aşağıdaki insert kodunu çalıştırdığımızda trigger da çalışacağı için 2 recordset dönecek. İlk inserted daki kayıt satırını getirecek, 2. sinde herhangi bir silme kaydı olmadığı için boş kayıt gelecek..

INSERT INTO TestTablo1(Name)
VALUES('Test1')

Trigger'ın çalıştığını ve 2 recordset döndürdüğünü gördük.. Şimdi de devre dışı bırakalım.. Aşağıdaki kodu yazmak ve çalıştırmak yeterli..

DISABLE TRIGGER trTestTrigger1 ON TestTablo1
GO


Aynı insert kodunu bir kere daha çalıştırırsak herhangi bir recordset dönmediğini, yani trigger ın çalışmadığını anlayabiliriz..

Tekrar devreye almak yine çok kolay...

ENABLE TRIGGER trTestTrigger1 ON TestTablo1
GO


Kodunu çalıştırmak yeterli..

Trigger ımızı tekrar devre dışı bırakalım. Sonra da disabled trigger larımızı nasıl görebileceğimize bakalım..

Aktif veritabanındaki tüm triggerların isimlerini, bağlı oldukları tablonun id sini ve birkaç özelliğini gösteren bir system view i tanımlı. Bu view de trigger disabled olup olmadığı bilgisi de var.
Disabled olan tüm triggerları aşağıda sql cümleciğini kullanarak çekebiliriz. Triggerın bağlı olduğu tablonun objectid si de geliyor, object_name sistem fonksiyonunu kullanarak bu tablonun da adını alabiliriz..


SELECT
object_name(parent_id) as parentTable_name,
*
FROM sys.triggers
WHERE is_disabled = 1


Artık hangi triggerı devre dışı bırakmıştım, devreye almayı unuttuğum trigger olabilir mi gibi soruların cevabı basit bir sql cümlesinde..

Hatta bir tablodaki tüm triggerları da enable/disable etmek mümkün.. Trigger ismi yerine "ALL" anahtar kelimesini yazmak yeterli..

DISABLE TRIGGER ALL ON TestTablo1
GO

ENABLE TRIGGER ALL ON TestTablo1
GO



Triggerları kolayce devreden çıkarabildiğimize göre, test için yarattığımız objelerimi artık drop edebiliriz.


DROP TRIGGER trTestTrigger1
GO


DROP TABLE TestTablo1
GO