Insert | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar insert

Sql Server veritabanında en büyük 10 tablo

26 July 2010 Yorum yapılmamış

Sql Server‘da belli bir veritabanında en büyük tabloları bulmak için aşağıdaki sorguyu çalıştırabiliriz;

DECLARE @TabloBoyutlari TABLE (TabloAdi VARCHAR(50), SatirSayisi INT, AyrilmisAlan VARCHAR(50), KullanilanAlan VARCHAR(50), IndexBoyu VARCHAR(50), KullanilmayanAlan VARCHAR(50))

INSERT INTO @TabloBoyutlari
EXECUTE sp_MSforeachtable 'sp_spaceused [?]'

SELECT TOP 10 * FROM @TabloBoyutlari ORDER BY CONVERT(INT, REPLACE(AyrilmisAlan, ' KB', '')) DESC

Bu sorgu sayesinde ilgili veritabanındaki tabloların,

  • Tablo Adı
  • Satır Sayısı
  • MDF dosyasında ilgili tablo için ayrılmış alanın boyutu
  • MDF dosyasında ilgili tablo için ayrılmış alanın kullanılan boyutu
  • MDF dosyasında ilgili tablonun indexleri için ayrılmış alan
  • MDF dosyasında ilgili tablo için kullanılmayan alan

bilgilerine ulaşabiliriz.

İlgili tablo için aşağıdaki eşitlik her zaman doğrudur;

Kullanılan Alanı + Index Alanı + Kullanılmayan Alanı = Ayrılmış Alan

Benim bilgisayarımdaki AdventureWorks2008R2 örnek veritabanında yukarıdaki sorguyu çalıştırdığımda, şöyle bir sonuç alıyorum;

Sql Server - Veritabanında en büyük 10 tablo

Sql Server 2008 MERGE Operatörü

19 January 2010 1 yorum

Sql Server 2008 ile hayatımıza yeni bir operatör geldi : MERGE.

MERGE Operatörü koşullu olarak INSERT ve UPDATE yerine geçen bir operatördür.

İşlem yapmak istediğiniz kaydın varlığına bağlı olarak INSERT veya UPDATE işlemlerinden birisini gerçekleştirir.

Eskiden bu işi gerçekleştirmek için, her satır için çalışan bir döngü içerisinde satırın varlığını kontrol ettirdiğimiz IF kontrolü olurdu, ya INSERT cümlesini ya da UPDATE cümlesini çalıştırırdık.

MERGE operatörünün ana kullanım alanı DataWarehouse‘lar olacaktır.

OLTP mimarisinde veritabanınız içinde bulunan verilerinizin, OLAP mimarisinde veritabanınıza işlemek istediğinizde, varolan satırları UPDATE etmek, varolmayan satırları INSERT etmek istersiniz.

MERGE operatörü, bu karmaşık yapının oldukça basitleşmesini sağlıyor.

Kullanım şablonu;

MERGE INTO Tablo
USING (SELECT Cümlesi)
	WHEN MATCHED THEN
		UPDATE Cümlesi
	WHEN NOT MATCHED THEN
		INSERT Cümlesi

AdventureWorks 2008 veritabanında bulunan Production.UnitMeasure tablosunda bu özelliği nasıl kullanabileceğimizi bir örnek ile inceleyelim;

MERGE Production.UnitMeasure AS T
USING (SELECT 'KG', 'Kilogram') AS S (UnitMeasureCode, Name) ON (T.UnitMeasureCode = S.UnitMeasureCode)
	WHEN MATCHED THEN
		UPDATE SET Name = S.Name
	WHEN NOT MATCHED THEN
		INSERT (UnitMeasureCode, Name) VALUES (S.UnitMeasureCode, S.Name)

Sql Server 2008’de Çoklu Insert İşlemi

19 January 2010 1 yorum

Sql Server 2008 ile birlikte Çoklu Insert (Multiple Insert) özelliği de hayatımıza giriyor.

Microsoft bu özelliğin altında yatan tekniğe, “Table Value Costructor” adını vermiş.

Çoklu Insert (Multiple Insert) özelliği sayesinde Insert yapan DML cümlelerinde, birden fazla satırı işleme tabi tutabiliyoruz.

AdventureWorks 2008 veritabanında bulunan HumanResources.Department tablosunda bu özelliği nasıl kullanabileceğimizi bir örnek ile inceleyelim;

INSERT INTO
	HumanResources.Department
VALUES
	('İnsan Kaynakları', 'IK', GETDATE()),
	('Bilgi İşlem', 'IT', GETDATE()),
	('Muhasebe', 'MUH', GETDATE()),
	('Finans', 'FIN', GETDATE()),
	('Lojistik', 'LOJ', GETDATE()),
	('Kalite ve Eğitim', 'KVE', GETDATE())

Sql Server’da Hash işlemi

13 January 2010 Yorum yapılmamış

Uygulamalarımızda verileri hash‘lemeye her zaman ihtiyaç duyarız. Verileri hash’lemek için kullanabileceğimiz birçok araç vardır.

Eğer veriyi veritabanı katmanında (Sql Server) hash’lemek istiyorsak, MSDN‘de şu sayfada bulunan makalede okuyabileceğiniz gibi HASHBYTES fonksiyonu ile  yapabiliriz.

HASHBYTES fonksiyonu iki parametre alır;

Algoritma: Hash’leme algoritması. Alabileceği değerler; MD2, MD4, MD5, SHA, SHA1

Veri: Hash işlemine tabi tutulacak veri

HASHBYTES fonksiyonu geriye VarBinary(8000) tipinde değer döndürür.

MD5 algoritması ile hash işlemi yapan örnek kod;

SELECT
	KULLANICI_KODU,
	KULLANICI_ADI,
	HASHBYTES('MD5', KULLANICI_SIFRE) AS KULLANICI_SIFRE
FROM
	T_KULLANICI WITH (NOLOCK)
CREATE PROCEDURE PR_KULLANICI_EKLE
(
	@KULLANICI_KODU VARCHAR(5),
	@KULLANICI_ADI VARCHAR(50),
	@KULLANICI_SIFRE VARCHAR(15)
)
AS
INSERT INTO T_KULLANICI
	(KULLANICI_KODU, KULLANICI_ADI, KULLANICI_SIFRE, KAYIT_TARIHI)
VALUES
	(@KULLANICI_KODU, @KULLANICI_ADI, HASHBYTES('MD5', @KULLANICI_SIFRE), GETDATE())

SELECT SCOPE_IDENTITY()
CREATE PROCEDURE PR_KULLANICI_LOGIN
(
	@KULLANICI_ADI VARCHAR(50),
	@KULLANICI_SIFRE VARCHAR(15)
)
AS
SELECT
	KULLANICI_KODU,
	KULLANICI_ADI,
	HASHBYTES('MD5', KULLANICI_SIFRE) AS KULLANICI_SIFRE
FROM
	T_KULLANICI WITH (NOLOCK)
WHERE
	KULLANICI_ADI = @KULLANICI_ADI AND
	KULLANICI_SIFRE = HASHBYTES('MD5', @KULLANICI_SIFRE)

Güvenlik ihtiyaçlarından ötürü kıymetli bilgilerin network’ten ulaşılmasını önlemek için, veriyi taşımadan önce hash‘lemek isteyebilirsiniz. HASHBYTES fonksiyonu bu işin son derece kullanışlı gözüküyor.

Not : Yazıyı yazdıktan sonra gördüm ki, Emre Ayrılmaz şuradaki makalesinde aynı konuyu işlemiş, okunmasında fayda var.

@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() arasındaki farklar

02 December 2009 4 yorum

Sql Server’da Identity kolon içeren tablolar ile çalışırken, yeni üretilen identity değerine ihtiyacımız olur.

@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() aynı işi farklı yöntemlerle yapar; son üretilen identity değerini döndürmek.

SELECT @@IDENTITY
Açılmış olan bağlantıda son üretilen identity değerini döndürür. @@IDENTITY tablo ve scope bakmaksızın, connection’da üretilen son identity’yi verir. Dikkat : Eğer Insert yaptığınız tablo’da Trigger varsa, yanlış identity alabilirsiniz.

SELECT SCOPE_IDENTITY()
Açılmış olan bağlantıda ve sorgunun çalıştığı scope’ta son üretilen identity’yi döndürür. Trigger kullanılan tablolarda @@IDENTITY yerine SCOPE_IDENTITY() kullanılması tavsiye edilir.

SELECT IDENT_CURRENT(tablename)
Bağlantı ve scope bakmaksızın, parametre olarak verilen tabloda üretilen son identity değerini döndürür.

Örnek;

CREATE TABLE TEST_TABLO_1
(
	ID INT NOT NULL IDENTITY (1, 1),
	ACIKLAMA VARCHAR(500) NULL,
	BILGI VARCHAR(1000) NULL
)

CREATE TABLE TEST_TABLO_2
(
	ID INT NOT NULL IDENTITY (1, 1),
	ACIKLAMA VARCHAR(500) NULL,
	EKSTRA_BILGI VARCHAR(1000) NULL
)

GO

CREATE TRIGGER TRG_TEST ON TEST_TABLO_1
FOR INSERT
AS
INSERT INTO TEST_TABLO_2
	(ACIKLAMA, EKSTRA_BILGI)
VALUES
	('Açıklama', 'Extra Bilgi')

GO

INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES ('DENEME', 'TEST1')
INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES ('DENEME', 'TEST2')
INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES ('DENEME', 'TEST3')
INSERT INTO TEST_TABLO_2 (ACIKLAMA, EKSTRA_BILGI) VALUES ('DENEME', 'TEST4')

INSERT INTO TEST_TABLO_1 (ACIKLAMA, BILGI) VALUES ('DENEME', 'TEST1')

SELECT @@IDENTITY
UNION ALL
SELECT SCOPE_IDENTITY()
UNION ALL
SELECT IDENT_CURRENT('TEST_TABLO_1')

GO

DROP TRIGGER TRG_TEST
DROP TABLE TEST_TABLO_1
DROP TABLE TEST_TABLO_2

Sorgunun çıktısı;

IDENTITY_SCOPE_IDENTITY_IDENT_CURRENT

Gördüğünüz gibi, SELECT @@IDENTITY çalışan Trigger’dan etkilenerek yanlış sonucu döndürmüştür.

TEST_TABLO_2‘ye ilk eklediğimiz kayıtta, identity olarak 5 aldık.

SELECT SCOPE_IDENTITY() ise, doğru değer (1) döndürdü.