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.
Etiketler:
over,
sql,
t-sql,
window function
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.
Ş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.
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
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,''),'')
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 :
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..
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..
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...
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..
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..
Triggerları kolayce devreden çıkarabildiğimize göre, test için yarattığımız objelerimi artık drop edebiliriz.
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
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')
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
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
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
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
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
GO
DROP TABLE TestTablo1
GO
Etiketler:
disable trigger,
enable trigger,
sql,
sql server,
Trigger
