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

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ü.

Kısa Sınav - 3

ClickOnce ile deploy ettiğiniz uygulamanızda, programatik olarak güncelleme olup olmadığını kontrol etmek istiyorsunuz.

Hangi class’tan örnek oluşturmanız lazım?

  • Module
  • ApplicationDeployment
  • Assembly
  • DeploymentServiceCom Sorunun doğru cevabı için;

Doğru cevap: ApplicationDeployment class’ı olacak.

Assembly class’ını, başka assembly’leri hafızaya yüklemek için kullanırız.

Module class’ını, module’ler üzerinde reflection uygulamak için kullanırız.

DeploymentServiceCom class’ı .Net Framework kütüphanesinin kendisi tarafından kullanılmak üzere yazılmıştır. Direk olarak bizim tarafımızdan kullanılmaması gerekir.

ApplicationDeployment class’ı, ClickOnce ile deploy ettiğimiz uygulamalarda, güncel versiyon yayınlanıp yayınlanmadığını programatik olarak kontrol edebilir.

MSDN’de yer alan şu sayfada ApplicationDeployment class’ı hakkında detaylı bilgiye ulaşabilirsiniz.

Sql Server CSV (Comma Seperated Value) çıktı üretme

Özellikle katalog tablolarının CSV çıktılarına sıklıkla ihtiyaç duyarız. Aşağıdaki sql script’ini kullanarak, siz de tablolarınızdan CSV çıktı alabilirsiniz.

Öncelikle tablomuzun orjinal haline bakalım;

SELECT Name FROM HumanResources.Shift WITH (NOLOCK)</pre> sql-csv-output_1

Şimdi öyle bir sql sorgusu yazacağız ki, çıktımız şu şekilde olacak;

Day, Evening, Night

SELECT
    SUBSTRING((
        SELECT ', ' + Name
        FROM HumanResources.Shift WITH (NOLOCK)
        FOR XML PATH('')
    ), 3, 8000) AS CSV

Sorguyu FOR XML anahtar kelimeleri ile çalıştırdığımıza ve PATH olarak ‘’ (boş string) verdiğimize dikkat edin.

SELECT ', ' + Name
FROM HumanResources.Shift WITH (NOLOCK)
FOR XML PATH('')


Böylece aşağıdaki sonucu elde etmiş olduk;

![sql-csv-output_2](/assets/uploads/2009/11/sql-csv-output_2.png "sql-csv-output_2")

Son olarak, sql sorgusunu SUBSTRING fonksiyonu içerisine koyduk, böylece baştaki virgül ve boşluk karakterlerinden (", ") kurtulmuş olduk.

![sql-csv-output_3](/assets/uploads/2009/11/sql-csv-output_3.png "sql-csv-output_3")

Sql Server ServerProperty Fonksiyonu

Sql Server’ın çalıştığı sunucu ile ilgili özellik bilgilerine sorgu ile erişmek istediğimizde kullanabileceğimiz bir fonksiyon var;

SERVERPROPERTY ( *propertyname *)

Örnek;

SELECT SERVERPROPERTY(‘edition’) AS SURUM, SERVERPROPERTY(‘productlevel’) AS SEVIYE, SERVERPROPERTY(‘productversion’) AS VERSIYON, SERVERPROPERTY(‘servername’) AS SUNUCU_ADI

SERVERPROPERTY fonksiyonunun alabileceği tüm propertyname parametreleri ve açıklamaları için şuradaki MSDN sayfasına bakınız.

Silverlight 4 TextTrimming özelliği

Silverlight 3 ve öncesi versiyonlarda, yazı alanına sığmayan metinleri, üç nokta ekleyerek trim etmek için, kendi kontrolümüzü yazmamız gerekiyordu.

Mesela, elimizde şöyle uzun bir yazı olsun;

Silverlight helps you create rich web applications that run on Mac OS, Windows, and Linux. Welcome to a new level of engaging, rich, safe, secure, and scalable cross-platform experience.

Bu yazıyı, 250px’lik bir metin alanında göstermemiz lazım, ama sığmayan kısımları yanyana üç nokta ile göstermemiz gerekiyor.

Silverlight helps you create rich web applications …

Silverlight 4 versiyonundan önce, bu isteğimizi yerine getirmek için, kendi TextBlock kontrolümüzü yazmamız gerekirdi.

Silverlight 4 versiyonla birlikte ise, TextBlock kontrolünün TextTrimming=”WordEllipsis” özelliğini kullanabiliyoruz.

Örnek kod:

<TextBlock FontSize=”16” TextTrimming=”WordEllipsis” Width=”250” Text=”Silverlight helps you create rich web applications that run on Mac OS, Windows, and Linux. Welcome to a new level of engaging, rich, safe, secure, and scalable cross-platform experience.” />

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı