Genel Tartışma Sıkça Sorulan Sorular

Tüm Yanıtlar

  • 04 Ekim 2010 Pazartesi 07:25
    Moderatör
     
     

    1) Microsoft SQL server 2008 deneme sürümünü nereden indirebilirim?


    http://www.microsoft.com/sqlserver/2008/en/us/trial-software.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:25
    Moderatör
     
     

    2) Microsoft SQL Server 2005'te yeni bir bakım planı oluşturduğunuzda hata iletisi: "oluşturma bakım planı başarısız oldu" hatasının giderilmesi.

    Bu davranışı gidermek için SQL Server 2005 CD'den Integration Services hizmetini yükleyin. Bunu yapmak için şu adımları izleyin:
    1. SQL Server Installation Wizard Çalıştır. 
    2. Tarama tamamlandıktan sonra sistem yapılandırması denetimi sayfasında İleri'yi tıklatın. 
    3. Ad kutusuna ve şirket kutusuna uygun bilgileri girin ve İleri'yi tıklatın. 
    4. Integration Services onay kutusunu seçmek için tıklatın ve sonra İleri'yi tıklatın. 
    5. İleri'yi tıklatın ve Yükle'yi tıklatın. 
    6. Yükleme tamamlandığında, İleri'yi tıklatın ve ardından Son'u tıklatın.

    Daha fazla bilgi için : http://support.microsoft.com/kb/909036



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:26
    Moderatör
     
     

    3) SQL Server 2005 de Veritabanı De-Attach işlemini nasıl gerçekleştirebilirim?
    Bir veritabanını ayırmak için;
    a)SQL Server Management Studio Object Explorer, SQL Server Database Engine kopyasına bağlanın ve örneğini genişletin.
    b)Veritabanları ' nı genişletin ve ayırmak istediğiniz kullanıcı veritabanı adını seçin.
    c)Bir veritabanı ayırma veritabanı özel kullanım erişimi gerektirir. Veritabanı kullanımda ise, tek bir kullanıcı erişimi kısıtlayın:

    Veritabanı adını sağ tıklatın ve Özellikler için gelin.
    Sayfa bölmesini seçin, seçenekleri seçin.
    Diğer seçenekleri bölmesinde durumu seçeneklerine ilerleyin.
    Restrict Access seçeneğini seçin ve kendi açılan listesinde tek seçin.
    Tamam'ı tıklatın.
    Bu eylem veritabanı tüm bağlantıları kapatın bildiren bir ileti kutusu görüntülenir. Devam etmek için Tamam'ı tıklatın.

    d)Veritabanı adını sağ tıklatın, Görevler ' e gidin ve sonra Ayır ' ı tıklatın. Detach veritabanı iletişim kutusu görüntülenir.
    e)Veritabanları ayırmak için kılavuz seçili veritabanının adını Veritabanı adı sütununda görüntüler. Ayırmak istediğiniz veritabanı olduğunu doğrulayın.
    f)Varsayılan olarak, ayırma işlemi herhangi bir güncel optimizasyonu istatistikleri İstatistikleri Güncelleştir onay kutusunu tıklatın, varolan optimizasyonu istatistikleri güncelleştirmek için veritabanı; ayırma korur.
    g)Varsayılan olarak, veritabanı ile ilişkili herhangi bir tam-metin katalogları ayırma işlemi tutar. Bunları kaldırmak için Tam metin kataloglarını Koru onay kutusunu temizleyin.
    h)Durum sütunu (hazır veya Not Ready) geçerli veritabanı durumunu görüntüler.

    Durumu Değil hazır ise, Message sütun Köprülü veritabanı hakkında bilgi görüntüler. Çoğaltma ile ilgili bir veritabanı, veritabanı çoğaltılmış Message sütunu görüntüler. Ne zaman bir veritabanı varsa veya daha etkin bağlantıları, Message sütun <number_of_active_connections> Active bağlantıları görüntüler; örneğin, 1 Active bağlantıları. Veritabanını ayırmadan önce Alt bağlantıları onay kutusunu seçerek etkin bağlantıları kesmelisiniz.

    Bir ileti hakkında daha fazla bilgi edinmek için köprüyü tıklatın.
    i)Veritabanını ayırmak hazır olduğunuzda, Tamam ' ı tıklatın.
    Daha fazla bilgi için : http://technet.microsoft.com/en-us/library/ms191491.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:26
    Moderatör
     
     

    4) SQL Server 2008’in sorunsuz yüklendiğini nasıl kontrol edebilirim?
    SQL Server 2008 yüklemenin başarılı olduğunu doğrulamak için Hizmetleri yüklemeyi seçtiğiniz bileşenleri bilgisayarınızda çalıştığından emin olun.
    a) SQL Server (ÖrnekAdı)
    b) SQL Server Agent (ÖrnekAdı)
    c) Reporting Services (ÖrnekAdı)
    d) SQL Server Browser

    Daha fazla bilgi için : http://technet.microsoft.com/en-us/library/bb510455.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:26
    Moderatör
     
     

    5) SQL Server Management Studio da bağlı sunucumu nasıl kaydettirebilirim?
    a) Object Explorer'da bağlı olduğunuz sunucu üzerine sağ tıklayıp Kaydet’i tıklayın
    b) Register Server iletişim kutusunda metin kutusuna, bu sunucu için görünmesini istediğiniz adı yazın. Bu sunucunun adı olması gerekmez
    c) Server açıklama metin kutusuna isteğe bağlı olarak sunucu tanımanıza yardımcı olacak ek bilgiler yazın.
    d) Bir sunucu grubu seçin kutusunda, bir sunucu grubunu tıklatın ve Kaydet ' i tıklatın.

    Daha fazla bilgi için :  http://technet.microsoft.com/en-us/library/ms188717.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:27
    Moderatör
     
     

    6) SQL Server'a paketleri dağıtmak için hangi adımları izlemeleliyim?

    a) Hedef bilgisayar dağıtım klasörünü açın.
    b) Paket Yükleme Sihirbazı'nı başlatmak için Bildirim dosyası < proje adı > .SSISDeploymentManifest çift tıklatın.
    c) SSIS paketleri dağıtma sayfasında SQL Server dağıtım seçeneği seçin.
    d) İsteğe bağlı olarak, hedef sunucuda yüklü sonra paketleri doğrulamak için Doğrula yüklemeden sonra paketleri seçin.
    e) Hedef SQL Server belirtin sayfasında, paketleri yüklemek ve bir kimlik doğrulama modunu seçmek için SQL Server örneğini belirtin. SQL Server kimlik doğrulaması seçerseniz, kullanıcı adı ve parola sağlamanız gerekir.
    f) Yükleme klasörünü seç sayfasında yüklenecek paket bağımlılıkları için dosya sistemindeki klasörü belirtin.
    g) Paket yapılandırmalarını içeriyorsa, değerleri paketleri Yapılandır sayfasında değer listesinde güncelleştirerek yapılandırmaları düzenleyebilirsiniz
    h) Yüklemeden sonra paketleri doğrula seçildi ise, dağıtılan paketlerim doğrulama sonuçlarını görüntüleyebilirsiniz.

    Daha fazla bilgi için : http://technet.microsoft.com/en-us/library/ms140117(SQL.90).aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:27
    Moderatör
     
     

    7) SQL Server 2008 R2 de Nasıl Yedek Alabilirim?
    Bir veritabanını yedeklemek için
    a) Microsoft SQL Server Database Engine da uygun örneğe bağlandıktan sonra Object Explorer'da sunucu adını tıklatın vesunucu ağacı genişletin.
    b) Veritabanları ' nı genişletin,  bir kullanıcı veritabanını seçin veya Sistem veritabanları ' nı genişletip bir sistem veritabanını seçin.
    c) Veritabanını sağ tıklatın, Görevler ' e gidin ve ardından Yedekle'yi tıklatın. Burada Veritabanı Yedekle iletişim kutusu görüntülenir.
    d) Veritabanı liste kutusunda, veritabanı adını doğrulayın. İsteğe bağlı olarak farklı bir veritabanı listeden seçebilirsiniz
    e) Herhangi bir kurtarma modeli için (FULL, BULK_LOGGED veya SIMPLE) bir veritabanı yedekleme gerçekleştirebilirsiniz.
    f) Tam yedekleme türünü liste kutusundan seçin.
    g) Yedekleme bileşeni için veritabanı ' nı tıklatın
    h) Varsayılan yedekleme kümesi adı metin kutusunda önerilen adı kabul edin veya yedekleme kümesi için farklı bir ad girin
    i) İsteğe bağlı olarak, Açıklama metin kutusuna, yedekleme kümesinin açıklamasını girin.
    j) Yedekleme kümesi sona erme tarihini belirtin ( Optional )
    k) Yedekleme hedef tür disk veya teyp tıklatarak seçin. En fazla 64 disk yolları seçin veya bir tek ortam kümesi içeren sürücüler teyp için Ekle'yi tıklatın. Seçili dizin       yolları için yedekleme liste kutusunda görüntülenir.
    l) Gelişmiş seçenekleri seçmek ve görüntülemek için Seçenekler ' i tıklatın.
    m) Güvenilirlik bölümünde, isteğe bağlı olarak aşağıdaki adımları işaretleyin
            a. Bittiğinde yedeği kontrol et
            b. Medya ya yazmadan önce sağlama topla
            c. Hata olduğunda devam et
    n) Tamam’ı tıklatın.

    Daha fazla bilgi için ; http://msdn.microsoft.com/en-us/library/ms187510.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:27
    Moderatör
     
     

    8) SQL Server sürümü, sürüm düzeyi ve Service pack seviyesini nasıl belirleyebilirsiniz?
    http://support.microsoft.com/kb/321185



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:28
    Moderatör
     
     

    9) Neden SQL Server 2008 yüklerden "Bilgisayarı Yeniden Başlat" kuralını  pas geçemiyorum?
    Sorun: Bazen SQL Server kurulumu sırasında Setup Support Rules adımına gelindiğinde bilgisayarın yeniden başlatılması gerektiği gibi bir bilgilendirme mesajı görüntülenir. Bilgisayar birkaç kez yeniden başlatılmasına rağmen kurulum başarısız olmaktadır.
    Çözüm: Bu durum çoğunlukla başka bir uygulama kurulumu sırasında PendingFileRenameOperations adlı kayıt defteri girdisinin doğru şekilde modifiye edilmemesi ya da silinmemesi durumunda ortaya çıkar.

    Çözüm için aşağıdaki adımlar uygulanabilir :
     
    a) Kayıt defterini açın. Başlat -> Çalıştır, bu alana "regedit" yazıp Enter tuşuna basın.
    b) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager kayıt defteri girdisini bulun ve "PendingFileRenameOperations"  anahtarındaki her değeri silin.

     



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:28
    Moderatör
     
     

    10) SQL Server örneğinin (instance) ismini nasıl değiştiririm?
    Sorun: SQL Server örneğimin ismini değiştirmek istiyorum.
    Çözüm: SQL Server örnek isminin direk değiştirilmesi işlemini desteklemez. Bu sorunun çözümü için aşağıdaki çözüm yollarını deneyebilirsiniz :
     
    a) Hali hazırdaki SQL Server örneğini silip yeni bir isimle yeniden kurulumunu yapmak.
    b) Bilgisayar ismini değiştirdiğinizde  SQL Server örnek ismi de değişecektir.
    Örneğin Ornek1 adında bir SQL Server örneğimiz olsun. Bilgisayar ismi de MyPC olsun,bu durumda SQL server örnek ismi \\MyPC\\Ornek1 olur,bilgisayar ismini YourPC yaparsak örnek ismi de \\YourPC\\Ornek1 olacaktır.
    c) Varsayılan örneğin yeniden adlandırılması için aşağıdaki prosedürleri çalıştırın
     
      sp_dropserver <old_name>;
      GO
      sp_addserver <new_name>, local;
      GO
     
    d) İsimlendirilmiş örneğe yeni isim vermek için :
     
      sp_dropserver <old_name\instancename>
      GO
      sp_addserver <new_name\instancename>, local
      GO
     
    Detaylı bilgi için aşağıdaki bağlantıyı ziyaret edebilirsiniz:
    http://technet.microsoft.com/en-us/library/ms143799.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:28
    Moderatör
     
     

    11) Sorun : Neden SQL Server Management Studio kullanarak SQL Server'a Windows Authentication ile kullanıcı girişi yapamıyorum?
    SQL Server Management Studio kullanarak SQL Server'a Windows Authentication ile kullanıcı girişi yapamıyorum ancak SQL Authentication kullandığımda sorun olmuyor nedeni  ne olabilir?
    Çözüm: Sunucuya Windows Authentication kullaranak kullanıcı girişi yapmak istiyorsanız kullandığınız Windows hesabınızın sunucuya eklenmiş olduğundan emin olun. Windows hesabınızın eklenip eklenmediğini aşağıdaki Transact- SQL cümlesini çalıştırarak kontrol edebilirsiniz :
     
    a. SELECT loginname FROM sys.syslogins 
    b. Eğer Windows hesabınız listelenmediyse bu hesabı sunucudaki kullanıcı giriş hesaplarına eklemeniz gerekir.  Sistem yöneticisi hesabıyla SQL Server örneğine kullanıcı girişi yaptıktan sonra aşağıdaki Transact-SQL cümlesi çalıştırılmalıdır :

    CREATE LOGIN [Computer_Name\Local_Windows_Account_Name]
    FROM WINDOWS WITH DEFAULT_DATABASE=[master]
    GO
     
    Yukarıdaki işlemi ayrıca Management Studio GUI'sinden de yapabilirsiniz. Object Explorer'dayken Security--> Logins,sağ tık -> New Login
     
    Detaylı bilgi :
    http://technet.microsoft.com/en-us/library/ms189751.aspx

     
    Not: SQL Server Management Studio Windows Vista/7 üzerinde kuruluysa bu işlemleri yapmak için "yönetici olarak" başlatılmalıdır.



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:28
    Moderatör
     
     

    12) Tek veritabanı içerisinde birçok dilden veriyi nasıl saklarım?
    Sorun: Internetin büyümesiyle birlikte global pazarda çalışmak için veritabanlarının genişlemesi çok önemlidir. Sunucunuz veritabanlarınız,tablolarınız ya da sütünlarınız için alfabeyi belirleyebilmenize rağmen alfabeler bir veri sayfası oluştururlar ve herhangi veri tipi için temsil ettikleri karakterler bellidir. Tüm dillerin desteklendiği bir veritabanı tasarımı oldukça zordur.
     
    Çözüm: Öncelikle uluslararası verinin saklanacağı veritabanındaki veri tipleri Unicode olmayan char,vchar ve text yerine Unicode olan nchar,nvarchar ve nvarchar (max) olarak seçilmelidir. Unicode her yazı karakteri için yazılım ve dil gözetmeksizin bir ve yalnız bir kod bulunduran standart bir kodlama sistemidir.  Unicode tüm dillerden tüm karakterleri desteklediğinden farklı karakter setleri için farklı kodlama sistemi kullanılmasına gerek kalmaz.
     
    Unicode ile ilgili makale :
    http://technet.microsoft.com/en-us/library/ms187828.aspx
     
    Unicode kullanımı ile ilgili makale :
    http://technet.microsoft.com/en-us/library/ms191200.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:29
    Moderatör
     
     

    13) Uzun süreli engellemeyi nasıl tespit edebilirim?
    Sorun: Uygulamam bazen veritabanı üzerinde sorgular çalıştırıldığında donuyor. Bir engelleme durumu olduğunadan şüpheleniyorum. 1 dakikadan uzun süren işlemler için engellenen herhangi bir işlem olup olmadığını tespit etmek istiyorum bunu nasıl yapabilirim?
    Çözüm: Uzun süreli engellemenin tespiti için BlockedProcessThreshold adlı konfigürasyon parametresi kullanabiliriz. Bu parametre ile birlikte kullanıcı tarafından konfigüre edilen server çapında bir engelleme-eşik süresi belirlenebilir. Bu eşik saniye cinsinden tanımlanır. Bu eşik süresini geçen her engelleme SQL Trace veya SQL Server Profiler tarafından yakalanır .
     
    a) Aşağıdaki cümleyi çalıştırın:

    exec sp_configure 'show advanced options', 1;
    reconfigure;
    go
    exec sp_configure 'blocked process threshold', 60;
    reconfigure;
     
    b) Engellenen işlem için eşik değer belirlendikten sonra izleme olayını yakalayın. İzleme olayları 60 saniyeyi geçen engellemeler için SQL Trace veya SQL Server Profiler tarafından yakalanabilir.
     
    c) SQL Trace kullanıyorsanız sp_trace_setevent prosedürünü ve event_id = 137 alarak kullanınız.
     
    d) SQL Profiler kullanıyorsunuz engellenmiş işlem rapor olayları snınıfını seçin.
     
    Engellenmiş uygulamalar için aşağıdaki 2 adımı uygulayabilirsiniz :
    İlk olarak SQL Server Management Studio içerisinden "select * FROM sys.sysprocesses where blocked<>0" cümlesini çalıştırarak bloklayan ya da bloklanan işlemleri görebilirsiniz.
    Hangi programın engelleme işlemini gerçekleştirdiğini bulmak için "select * from sys.dm_exec_sessions where session_id=<bloker id>"  cümlesini çalıştırmanız yeterli olacaktır.

    Detaylı bilgi için aşağıdaki bağlantıları ziyaret edebilirsiniz:

    Engellenen işlem eşik seçeneği :
    http://technet.microsoft.com/en-us/library/ms181150.aspx

    Rapor olayı sınıfı:
    http://technet.microsoft.com/en-us/library/ms191168.aspx

    Sp_trace_setevent:
    http://technet.microsoft.com/en-us/library/ms186265.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 04 Ekim 2010 Pazartesi 07:29
    Moderatör
     
     

    14) SQL Server Management Studio Object Explorer alanında neden veritabanlarını,tabloları,görünümleri vb.listelenmiyor?

    Sorun: Bazen "Select column1,column2,… from tablo_adi" gibi bir T-SQL cümlesini çalıştırdığınızda SQL Server Management Studio'da Tables alanında tablo adını görülmemesi gibi olaylarla karşılaşabilirsiniz.
    Çözüm: Sorun belirli bir nesne için (tablo,veritabanı)  VIEW DEFINITION izninin olmamasından kaynaklanır.
    Sorunun çözümü için kullanıcıya o nesne üzerinde VIEW DEFINITION izninin sağlanması gerekir. Bunu aşağıda yazan Transact-SQL cümlesini çalıştırarak yapabiliriz :
     
    USE database_name;
    GO
    GRANT VIEW DEFINITION ON [object_name] TO [database_user/database_role]
     
    Detaylı bilgi için aşağıdaki bağlantıyı ziyaret edebilirsiniz :
    http://technet.microsoft.com/en-us/library/ms175808.aspx



    Serkan Bark, MSFT  
    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
  • 01 Şubat 2011 Salı 13:09
    Moderatör
     
      Kod İçerir

    1) Iki tarih arasındaki verilerin bulunması

    Bir sistemde en çok gereksinim duyulacak özelliklerden biri de verinin kronolojik olarak takip edilebilmesidir. Bu noktadan bakıldığında 2 tarih arasındaki verinin elde edilmesi işleminin çok sık kullanılacağını da söylemek yanlış olmaz. SQL ile sorgu yazarken tekrarlanarak yapılan hatalardan biri de "between" operatörü kullanılan sorgulardır. Bu sorgular aynı satırın 2 kere getirilmesine yol açabilir.

     

    Aşağıdaki veri üzerinden bir örnek geliştirmek istersek :

     

    orderid

    SubTotal

    Shipping

    OrderTotal

    OrderDate

    1

    100.00

    0.00

    100.00

    2007-12-22 23:06:16.820

    2

    75.00

    5.95

    80.95

    2007-12-22 23:06:59.787

    3

    25.00

    5.95

    30.95

    2007-12-22 23:09:18.083

    4

    50.00

    5.95

    55.95

    2007-12-22 23:13:15.120

    5

    50.00

    5.95

    55.95

    2007-12-22 23:28:49.860

    6

    50.00

    10.45

    60.45

    2007-12-22 23:37:44.593

    7

    200.00

    13.70

    213.70

    2007-12-22 23:56:10.533

    8

    25.00

    5.95

    30.95

    2007-12-23 00:00:00.000

    9

    50.00

    5.95

    55.95

    2007-12-23 00:01:19.477

    10

    50.00

    5.95

    55.95

    2007-12-23 00:08:43.227

     

    Yukarıdaki verileri üreten sql script :

     

    SET NOCOUNT ON
     
    
    DECLARE @Orders TABLE
    (Orderid int identity primary key,
     subtotal decimal(18,2),
     shipping decimal(18,2),
     Ordertotal decimal(18,2),
     Orderdate datetime)
     
    
    INSERT INTO @Orders VALUES (100.00, 0.00, 100.00, 'Dec 22 2007 11:06:16:820PM')
    INSERT INTO @Orders VALUES (75.00, 5.95, 80.95, 'Dec 22 2007 11:06:59:787PM')
    INSERT INTO @Orders VALUES (25.00, 5.95, 30.95, 'Dec 22 2007 11:09:18:083PM')
    INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 22 2007 11:13:15:120PM')
    INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 22 2007 11:28:49:860PM')
    INSERT INTO @Orders VALUES (50.00, 10.45, 60.45, 'Dec 22 2007 11:37:44:593PM')
    INSERT INTO @Orders VALUES (200.00, 13.70, 213.70, 'Dec 22 2007 11:56:10:533PM')
    INSERT INTO @Orders VALUES (25.00, 5.95, 30.95, 'Dec 23 2007 12:00:00:000AM')
    INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 23 2007 12:01:19:477AM')
    INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 23 2007 12:08:43:227AM')
    
    

     

    Yukarıdaki veriler içerisinden "12/22/2007" tarihine bir filtreleme  yapmak isteyelim. Bunun için ilk olarak BETWEEN 12/22/2007 AND 12/22/2007 kullanmayı deneyelim.

     

     

    DECLARE @Orderdate datetime
    SET @Orderdate = '2007/12/22'
     
    SELECT * 
    FROM @Orders
    WHERE Orderdate BETWEEN @Orderdate AND @Orderdate
     
    --Sonuçlar
    Orderid subtotal shipping Ordertotal Orderdate
    -------- --------- --------- ------------ ----------- 
    
    

     

    Görüldüğü gibi yukarıdaki sorgu bize sonuç döndürmedi. Belki DATEADD kullanarak 12/22/2007 ile 12/23/2007 arasındaki verileri elde edebiliriz diyip aşağıdaki sorguyu çalıştıralım :

    DECLARE @Orderdate datetime
    SET @Orderdate = '2007/12/22'
     
    SELECT * 
    FROM @Orders
    WHERE Orderdate BETWEEN @Orderdate AND DATEADD(dd, 1, @Orderdate)
     
    -- Sonuçlar
    Orderid subtotal shipping Ordertotal Orderdate
    -------- --------- --------- ------------ -----------------------
    1 100.00 0.00 100.00 2007-12-22 23:06:16.820
    2 75.00 5.95 80.95 2007-12-22 23:06:59.787
    3 25.00 5.95 30.95 2007-12-22 23:09:18.083
    4 50.00 5.95 55.95 2007-12-22 23:13:15.120
    5 50.00 5.95 55.95 2007-12-22 23:28:49.860
    6 50.00 10.45 60.45 2007-12-22 23:37:44.593
    7 200.00 13.70 213.70 2007-12-22 23:56:10.533
    8 25.00 5.95 30.95 2007-12-23 00:00:00.000
     
     
    SET @Orderdate = '2007/12/23'
     
    SELECT * 
    FROM @Orders
    WHERE Orderdate BETWEEN @Orderdate AND DATEADD(dd, 1, @Orderdate)
     
    -- Sonuçlar
    Orderid subtotal shipping Ordertotal Orderdate
    -------- --------- --------- ------------ -----------------------
    8 25.00 5.95 30.95 2007-12-23 00:00:00.000
    9 50.00 5.95 55.95 2007-12-23 00:01:19.477
    10 50.00 5.95 55.95 2007-12-23 00:08:43.227
    
    

     

    Yukarıdaki tabloları incelediğinizde bu sefer de 8 numaralı kaydın her iki sorgu sonucunda da döndürüldüğünü görürüz. İlk yaptığımız örnekte hiç sonuç döndürülmemesinin nedeni string olarak saat kısmı olmadan bir tarih belirttiğimizde bu tarih datetime veri tipine dönüştürülür ve saat kısmı 00:00:00.000 olarak kabul edilir. Bu yüzden ilk sorgu tam olarak 2007-12-23 00:00:00.000 anında yapılan kayıtları döndürür. Ikinci sorgumuza bakacak olursak DATEADD ile eklenen 1 günlük zaman aralığı 8 numaralı kaydın 2 sorguda da getirilmesine neden olmuştur.

     

    Kullanılması gereken en etkin yöntem BETWEEN değil küçüktür-büyüktür(küçük eşit-büyük eşit) operatörleridir. Aşağıdaki örnekte bu operatörleri kullanalım ve sonuçlara bir göz atalım.

     

     

    DECLARE @Orderdate datetime
    SET @Orderdate = '2007/12/22'
     
    SELECT * 
    FROM @Orders
    WHERE Orderdate >= @Orderdate AND Orderdate < DATEADD(dd, 1, @Orderdate)
     
    -- Sonuçlar
    Orderid subtotal shipping Ordertotal Orderdate
    -------- --------- --------- ------------ -----------------------
    1 100.00 0.00 100.00 2007-12-22 23:06:16.820
    2 75.00 5.95 80.95 2007-12-22 23:06:59.787
    3 25.00 5.95 30.95 2007-12-22 23:09:18.083
    4 50.00 5.95 55.95 2007-12-22 23:13:15.120
    5 50.00 5.95 55.95 2007-12-22 23:28:49.860
    6 50.00 10.45 60.45 2007-12-22 23:37:44.593
    7 200.00 13.70 213.70 2007-12-22 23:56:10.533
     
    SET @Orderdate = '2007/12/23'
     
    SELECT * 
    FROM @Orders
    WHERE Orderdate >= @Orderdate AND Orderdate < DATEADD(dd, 1, @Orderdate)
     
    -- Sonuçlar
    Orderid subtotal shipping Ordertotal Orderdate
    -------- --------- --------- ------------ -----------------------
    8 25.00 5.95 30.95 2007-12-23 00:00:00.000
    9 50.00 5.95 55.95 2007-12-23 00:01:19.477
    10 50.00 5.95 55.95 2007-12-23 00:08:43.227
    
    

     

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:15
    Moderatör
     
      Kod İçerir

    2) Duplicate(kopya) satırların bulunup silinmesi

    Kopya satırların silinmesi işlemi için aşağıdaki tabloyu kullanalım.

     

     

     

    Örnek Tablo:

     

    ID

    CustName

    Pincode

    1

    Jack

    45454

    2

    Jill

    43453

    3

    Tom

    43453

    4

    Kathy

    22343

    5

    David

    65443

    6

    Kathy

    22343

    7

    Kim

    65443

    8

    Hoggart

    33443

    9

    Kate

    61143

    10

    Kim

    65443

    İstenen Çıktı: Kopya satırlar kaldırıldıktan sonra

     

     

    ID

    CustName

    Pincode

    1

    Jack

    45454

    2

    Jill

    43453

    3

    Tom

    43453

    4

    Kathy

    22343

    5

    David

    65443

    7

    Kim

    65443

    8

    Hoggart

    33443

    9

    Kate

    61143

     

     

    Örnek tabloyu oluşturacak sql script :

     

     

    SET NOCOUNT ON
     
    -- Tablonun Oluşturulması
    CREATE TABLE #Customers (ID integer, CustName varchar(20), Pincode int)
     
    -- Tablonun örnek veri ile doldurulması
    INSERT INTO #Customers VALUES (1, 'Jack',45454 )
    INSERT INTO #Customers VALUES (2, 'Jill', 43453)
    INSERT INTO #Customers VALUES (3, 'Tom', 43453)
    INSERT INTO #Customers VALUES (4, 'Kathy', 22343)
    INSERT INTO #Customers VALUES (5, 'David', 65443)
    INSERT INTO #Customers VALUES (6, 'Kathy', 22343)
    INSERT INTO #Customers VALUES (7, 'Kim', 65443)
    INSERT INTO #Customers VALUES (8, 'Hoggart', 33443)
    INSERT INTO #Customers VALUES (9, 'Kate', 61143)
    INSERT INTO #Customers VALUES (10, 'Kim', 65443)
    
    

     

    Öncelikle kopya satırların hangi satırlar olduğunu tanılamak gerekirse yukarıdaki tabloda CustName ve Pincode sütun değerleri aynı olan satırlar kopya  satırlardır diyebiliriz. Satır 7 ve 10’u inceleyin. Kim isimli müşteri ve numarası aynı olduğundan bu satırlardan birinin silinmesi işlemini yapacağız. Bu örnekte ID değeri büyük olan satırın silinmesi işlemini gerçekleştirelim.

     

     

     

     

    -- kopya Satırların Bulunması
    SELECT MAX(ID) as ID, CustName, Pincode FROM #Customers
    GROUP BY CustName, Pincode
    HAVING COUNT(*) > 1
     
    -- kopya Satırların Silinmesi
    DELETE FROM #Customers
    WHERE ID IN 
    ( SELECT MAX(ID) FROM #Customers
    GROUP BY CustName, Pincode
    HAVING COUNT(*) > 1)
    
    

    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:23
    Moderatör
     
      Kod İçerir

    3) Veritabanı içerisindeki tüm verinin silinmesi

     

    Kullanıcı veritabanı içerisindeki tüm tablolardan bütün veriyi silmek isteyebilir. Bu gibi durumlarda veritabanı içerisindeki tabloların sayısı çok fazla ise bu işlemi manuel yapmak çok çok daha uzun zaman alacaktır. Hele tablolar arası ilişkilerin falan olacağını da düşünürsek bu işten vazgeçip yeni bir veritabanı oluşturmayı bile düşünebiliriz.

     

    Ancak aşağıdaki saklı yordam(Stored Procedure) ile birlikte tüm tablolardan tüm verilerin silinmesi işlemi yapılmaktadır. Lütfen çok dikkatli kullanın :) Kullanabileceğiniz SQL Server Sürümleri :

    2000,2005,2008

     

    CREATE PROCEDURE DeleteAllData
    AS
    BEGIN
    DECLARE @SQL nvarchar(2000), @CurrentTable sysname, @CurrentSchema sysname
     
    --Sunucu sürümüne özel değiştirilmesi gereken ifadeleri işlemek için sunucu sürümünü al
    DECLARE @ServerVersion int
    SET @ServerVersion = (SELECT CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS varchar(50)), CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS varchar(50))) - 1) AS int))
     
    --Bu çözümde bir cursor kullanılmıştır.Alternatif olarak sp_msforeachtable saklı yordamı ya da döngü mantığı da kullanılabilir.
      DECLARE TableCursor SCROLL CURSOR FOR
      SELECT QUOTENAME(TABLE_SCHEMA) AS schemaname, QUOTENAME(TABLE_NAME) AS name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
     
     
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable
     
    --Tüm triggerların devre dışı bırakılması
    WHILE @@FETCH_STATUS = 0
    BEGIN
      --Mevcut tablodaki triggerların devre dışı bırakılması için yazılan sorgu
      SET @SQL = 
      (SELECT  'ALTER TABLE '+ @CurrentSchema + '.' + @CurrentTable + ' DISABLE TRIGGER ALL')
      EXECUTE sp_ExecuteSQL @SQL;
      
      --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme
      IF @@ERROR = 0
        BEGIN
          PRINT ‘Triggerlar bu tablolar üzerinde başarı ile etkisizleştirildi ' + @CurrentSchema + '.' + @CurrentTable
        END
      ELSE
        BEGIN
          PRINT ‘Triggerlar bu tablolar üzerinde etkisizleştirilirken bir hata ile karşılaşıldı' + @CurrentSchema + '.' + @CurrentTable
        END
        
      --Mevcut tablodaki tüm constraint'leri devre dışı bırakma
      SET @SQL = 
      (SELECT  'ALTER TABLE '+ @CurrentSchema + '.' + @CurrentTable + ' NOCHECK CONSTRAINT ALL')
      EXECUTE sp_ExecuteSQL @SQL;
      
      --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme
      IF @@ERROR = 0
        BEGIN
          PRINT ‘Constraintler bu tablolar üzerinde başarı ile etkisizleştirildi ' + @CurrentSchema + '.' + @CurrentTable
        END
      ELSE
        BEGIN
          PRINT ‘Constraint’ler bu tablolar üzerinde etkisizleştirilirken bir hata ile karşılaşıldı ' + @CurrentSchema + '.' + @CurrentTable
        END
     
      --Cursor üzerinden bir sonraki tablonun getirilmesi
      FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable
    END
      
    --Cursor üzerindeki ilk tablonun getirilmesi
    FETCH FIRST FROM TableCursor INTO @CurrentSchema, @CurrentTable
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
      
      IF @ServerVersion >= 9 --SQL Server 2005 ya da daha üzeri bir versiyon kullanıyorsak TRY CATCH bize çok yardımcı olacaktır.
        BEGIN
        SET @SQL = (SELECT  'BEGIN TRY 
        TRUNCATE TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' 
        PRINT Veri başarı ile truncate edildi' + @CurrentSchema + '.' + @CurrentTable + ''' 
        END TRY 
        BEGIN CATCH 
        DELETE FROM ' + @CurrentSchema + '.' + @CurrentTable + '
        IF EXISTS(SELECT ''A'' FROM information_schema.columns 
          WHERE COLUMNPROPERTY(OBJECT_ID(''' + @CurrentSchema + '.' + @CurrentTable + '''), 
          column_name,''IsIdentity'')=1 AND QUOTENAME(TABLE_SCHEMA) = ''' + @CurrentSchema + '''
          AND QUOTENAME(TABLE_NAME) = ''' + @CurrentTable + ''')
          BEGIN
            DBCC CHECKIDENT(''' + @CurrentSchema + '.' + @CurrentTable + ''', RESEED, 0) 
          END
        PRINT ''Veri başarı ile buradan silindi.' + @CurrentSchema + '.' + @CurrentTable + ''' 
        END CATCH')
        END
      ELSE -- SQL Server 2000 üzerindeyiz demektir ve önce ForeignKey olup olmadığına bakalım..
        BEGIN
        SET @SQL = (SELECT  'IF OBJECTPROPERTY(OBJECT_ID(''' + @CurrentSchema + '.' + @CurrentTable + '''), ''TableHasForeignRef'') <> 1
          BEGIN
          TRUNCATE TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' 
          PRINT ''Veri başarıyla truncate edildi' + @CurrentSchema + '.' + @CurrentTable + ''' 
          END
        ELSE
          BEGIN
          DELETE FROM ' + @CurrentSchema + '.' + @CurrentTable + '
          IF EXISTS(SELECT ''A'' FROM information_schema.columns 
            WHERE COLUMNPROPERTY(OBJECT_ID(''' + @CurrentSchema + '.' + @CurrentTable + '''), 
            column_name,''IsIdentity'')=1 AND QUOTENAME(TABLE_SCHEMA) = ''' + @CurrentSchema + '''
            AND QUOTENAME(TABLE_NAME) = ''' + @CurrentTable + ''')
            BEGIN
              DBCC CHECKIDENT(''' + @CurrentSchema + '.' + @CurrentTable + ''', RESEED, 0) 
            END
          PRINT ''’Veri buradan başarıyla silindi ' + @CurrentSchema + '.' + @CurrentTable + ''' 
          END')
        END
        
      EXECUTE sp_ExecuteSQL @SQL;
      
      --Cursor üzerinden bir sonraki tablonun getirilmesi    
      FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable
    END
     
    --Cursor üzerinden ilk tablonun getirilmesi
    FETCH FIRST FROM TableCursor INTO @CurrentSchema, @CurrentTable
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
      --Triggerların yeniden kullanılabilir duruma getirilmesi
      SET @SQL = (SELECT  'ALTER TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' ENABLE TRIGGER ALL')
      EXECUTE sp_ExecuteSQL @SQL;
     
      --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme
      IF @@ERROR = 0
        BEGIN
          PRINT ‘Triggerlar yeniden aktifleştirildi' + @CurrentSchema + '.' + @CurrentTable
        END
      ELSE
        BEGIN
          PRINT ‘Triggerlar yeniden aktif hale getirilirken bir hata ile karşılaşıldı ' + @CurrentSchema + '.' + @CurrentTable
        END
        
      --Constraints'lerin tekrar kullanılabilir yapılması
      SET @SQL = (SELECT  'ALTER TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' CHECK CONSTRAINT ALL')
      EXECUTE sp_ExecuteSQL @SQL;
     
      --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme
      IF @@ERROR = 0
        BEGIN
          PRINTConstraint’ler başarı ile yeniden aktif edildi ' + @CurrentTable
        END
      ELSE
        BEGIN
          PRINT 'Constraint’ler aktif hale getirilirken bir hata ile karşılaşıldı' + @CurrentTable
        END
     
     
      --Cursor üzerinden bir sonraki tablonun getirilmesi    
      FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable
    END
     
    --Cursor'u kapat
    CLOSE TableCursor
    DEALLOCATE TableCursor
     
    END
     
    --EXEC DeleteAllData
    
    

     

    Notlar :

    ·         Saklı yordam içerisinde öncelikle tetikleyiciler(triggers) ve tablolar arası ilişkiler(constraints) kaldırılmış silme işlemi gerçekleştikten sonra bu yapılar tekrar kurulmuştur.

    ·         Yordam eğer SQL Server 2005 ve daha üzeri bir sürüm kullanıyorsanız TRY CATCH mantığıyla SQL Server 200 kullanıyorsanız OBJECTPROPERTY yardımıyla silme işlemini gerçekleştirir.

    ·         Sadece verilerin silinmesi ile veritabanı ve log dosyalarının boyutları küçülmez,bunun için DBCC SHRINKFILE yapısını incelemelisiniz :

    http://msdn.microsoft.com/en-us/library/ms189493.aspx

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:27
    Moderatör
     
      Kod İçerir

    4) Saklı yordamın (stored procedure) aynı anda sadece 1 kere kullanıldığından emin olmak

     

     

    Bazı durumlarda bir T-SQL kod bloğunun aynı anda sadece 1 kere çalıştığından emin olmak gerekebilir bu çoğu zaman eşzamanlılık sorunlarının yaşanmaması açısından önemlidir. Uzun süren bir işlem tamamlanmadan önce bir başka sorgunun çalıştırılmamasını isteyebilirsiniz.

     

    Aşağıda önerilen çözüm yöntemi SQL Server 2000 -2005 -2008 sürümlerinde uygulanabilir. Örnekte ayrıca Northwind veritabanı kullanılmıştır.

     

    Sp_getapplock ve sp_releaseapplock adındaki 2 sistem saklı yordamını kullanarak aynı anda sorgunun sadece 1 kere işletildiğinden emin olabiliriz.

     

     

    Kilitlenebilir bir SQL Sorgusunun oluşturulması :

    CREATE PROCEDURE dbo.Employees_U_LastName
      ( @EmployeeID  int,
       @LastName   varchar(20)
      )
    AS
      BEGIN
     
       SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
       BEGIN TRANSACTION
     
       DECLARE @LockResult int
     
       EXECUTE @LockResult = sp_getapplock 
         @Resource  = 'RepeatableRead_TRANSACTION', 
         @LockMode  = 'Exclusive',
         @LockTimeout = 0
      
         IF @LockResult <> 0
          BEGIN
            ROLLBACK TRANSACTION
            RAISERROR ( 51001, 16, 1 )
            RETURN
          END
     
         
     
         --Demo amaçlı 10 saniyelik bekleme süresi 
         WAITFOR DELAY '00:00:10'
     
         UPDATE Employees
          SET LastName = @LastName
          WHERE EmployeeID = @EmployeeID
     
         EXECUTE sp_releaseapplock 
          @Resource = 'RepeatableRead_TRANSACTION'
     
       COMMIT TRANSACTION
     
      END
     
    GO
    
    

     

    Daha sonra kilitlenebilen bu saklı yordam çalıştığı sırada başka bir istek gelirse görüntüleyeceğimiz kullanıcı tanımlı özel hata mesajını oluşturalım. (Kullanıcı tanımlı hata mesajları için hata numaraları 50000 ve üzeri verilmelidir.)

    USE Northwind
    GO
     
    EXECUTE sp_addmessage 
      @msgnum  = 51001, 
      @severity = 16, 
      @msgtext = N'Kaynak Kullanilabilir degil', 
      @lang   = 'us_english',
      @replace = REPLACE
    
    

     

    Şimdi uygulamaya geçelim. 2 ayrı Query Windows açalım ve aşağıdaki kodu bu 2 pencereden birine yapıştıralım. Lütfen 2 sorgu penceresine de gerekli kodlar yazılmadan ve veritabanı bağlantıları sağlanmadan kodu çalıştırmayın.

     

    EXECUTE dbo.Employees_U_LastName
       @EmployeeID = 1,
       @LastName  = 'Davolio-Jones'
     
       SELECT 
         EmployeeID,
         LastName,
         FirstName
       FROM Employees
       WHERE EmployeeID = 1
    Aşağıdaki kodu 2. Query Window içerisine kopyalayın :
     
    EXECUTE dbo.Employees_U_LastName
       @EmployeeID = 1,
       @LastName  = 'Davolio'
     
       SELECT 
         EmployeeID,
         LastName,
         FirstName
       FROM Employees
       WHERE EmployeeID = 1
    
    

     

     

    Birinci ekrandaki sorguyu çalıştırın ve hemen ardından 2. Sorgu penceresindeki sorguyu da çalıştırın. 2.Pencerede kendi oluşturmuş olduğumuz hata mesajını göreceksiniz :

     

    Msg 51001, Level 16, State 1, Procedure Employees_U_LastName, Line 21
    Kaynak Kullanilabilir Degil
     
    
    

     

     

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:29
    Moderatör
     
      Kod İçerir

    5) ISNULL() ve COALESCE()

     

    SQL Server'da null değerler ile ilgili işlem yapmak için kullanılabilecek 2 fonksiyon mevcuttur : ISNULL() ve COALESCE() .Geliştiriciler çoğu zaman null değerlerle karşılaştıklarında farklı(varsayılan) değerlerin döndürülmesini isteyebilirler bu yüzden bahsedilen 2 fonksiyon çok kullanışlı olmaktadır.

     

    ISNULL()

     

    ISNULL SQL Server ile built in gelen bir TSQL fonksiyonudur. ANSI-92 Standartlarında tanımlanmış bir fonksiyon değildir anca Microsoft  ANSI SQL Standartlarına ek olarak bu fonksiyonu da TSQL dilinde kullanıma sunmuştur.

     

    ISNULL() 2 parametre kabul eder. Ilk parametre değerlendilir eğer bu parametre null ise 2. parametre döndürülür.(2. Parametre null olsun ya da olmasın.) Lütfen aşağıdaki örneği inceleyin :

    SELECT ISNULL(NULL, 1)
    --1 Döndürür
    SELECT ISNULL(NULL, NULL)
    --NULL Döndürür
    
    

     

    COALESCE()

     

    COALESCE()'de SQL Server ile built in gelen bir TSQL fonksiyonudur. ISNULL() fonksiyonunun aksine COALESCE() ANSI-92 SQL Standartları içerisinde tanımlanmıştır. Coalesce fonksiyonu bir parametre seti içerisinde ilk NULL olmayan değeri döndürür. Bu parametre listesi  2 ya da daha fazla elemandan oluşabilir ve elemanlar farklı veri tiplerinde değerler içeriyor olabilirler. Lütfen aşağıdaki örneği inceleyin :

    SELECT COALESCE(NULL, 1)
    --1 Döndürür
     
    SELECT COALESCE(NULL, 3, NULL, 1)
    --3 Döndürür
    
    

     

    ISNULL - COALESCE Karşılaştırması

     

    Aynı sorunu çözen birden fazla metod varsa her zaman hangisi daha iyi sorusu akla gelir. 2 Fonksiyon arasında bazı farklılıklar vardır ve işi tartıya vurursak COALESCE biraz daha ağır basar diye düşünebiliriz.

     

    ·         COALESCE ANSI-92 Standartlarına uygundur. Eğer yazmış olduğunuz kodu bir başka RDBMS sisteme taşırsanız COALESCE yeniden bir kodlama gerekmeden çalışacaktır.

    ·         COALESCE ikiden fazla parametreyi kabul edebilirken ISNULL ile yalnızca 2 parametre ile çalışabilirsiniz. ISNULL fonksiyonları iç içe kullanılarak bir çözüm oluşturulabilmesine rağmen bu da parametre sayısının fazla olduğu durumlarda kullanışlı değildir.

    ·         ISNULL aldığı parametrelerin türlerini ilk parametrenin türüne bakarak değiştirir yani aşağıdaki sorguyu incelersek ISNULL kullanarak bazen istediğimiz sonuçları alamazken COALESCE ile bu sorunları yaşamayız.

     

    DECLARE @Field1 char(3), @Field2 char(50)
    SET @Field2 = 'Uzun String'
     
    SELECT ISNULL(@Field1, @Field2)
    --'Uzu'Döndürür
    SELECT COALESCE(@Field1, @Field2)
    --'Uzun String' Döndürür
    
    

    NOT : Diğer durumlarda COALESCE ile de beklenemyen sonuçlar alabilirsiniz. Örneğin integer ve datatime veri tiplerinden 2 veri üzerinde COALESCE uyguladığınızda Colaesce integer verisini datetime olarak cast edecektir.

    SELECT COALESCE(5, GETDATE())

    5 döndürmeyecek,1900-01-06 00:00:00.000 döndürecektir. (5 datetime olarak cast edilmiştir).

     

    ISNULL : http://msdn.microsoft.com/en-us/library/ms184325.aspx

     

    COALESCE : http://msdn.microsoft.com/en-us/library/ms190349.aspx

     

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:33
    Moderatör
     
      Kod İçerir

    6) Bir kolondan virgüllerle ayrılmış liste oluşturma

     

     

    Bazı durumlarda bir kolon içerisindeki verilerin virgüllerle ayrılmış bir liste olarak görüntülenmesini isteyebilirsiniz. Örnek vermek gerekirse aşağıdaki tabloyu

     

    MemberID

    Team

    FirstName

    1

    1

    Jim

    2

    1

    Mary

    3

    1

    Bob

    4

    2

    Sue

    5

    2

    Ralph

    6

    2

    Ellen

    7

    3

    Bill

    8

    3

    Linda

     

    Bu şekilde görüntülenmesini isteyebilirsiniz :

     

    Team

    Members

    1

    Bob, Jim, Mary

    2

    Ellen, Ralph, Sue

    3

    Bill, Linda

     

    Böyle bir çıktı alabilmek için birden fazla yol vardır öncelikle SQL Server 2005 ve 2008 için daha sonra SQL Server 2000 için çözüm yolları önereceğiz.

    Öncelikle 2 örnek için de kullanacağımız veritabanını oluşturalım :

     

    SET NOCOUNT ON
     
    
    CREATE TABLE TeamInfo
      ( MemberID  int IDENTITY,
       TeamID   int, 
       FirstName  varchar(50)
      )
     
    INSERT INTO TeamInfo VALUES ( 1, 'Jim' )
    INSERT INTO TeamInfo VALUES ( 1, 'Mary' )
    INSERT INTO TeamInfo VALUES ( 1, 'Bob' )
    INSERT INTO TeamInfo VALUES ( 2, 'Sue' )
    INSERT INTO TeamInfo VALUES ( 2, 'Ralph' )
    INSERT INTO TeamInfo VALUES ( 2, 'Ellen' )
    INSERT INTO TeamInfo VALUES ( 3, 'Bill' )
    INSERT INTO TeamInfo VALUES ( 3, 'Linda' )
    
    

    SQL Server 2005/2008 Çözümü

    SELECT
      t1.TeamID,
      MemberList = substring((SELECT ( ', ' + FirstName )
                  FROM TeamInfo t2
                  WHERE t1.TeamID = t2.TeamID
                  ORDER BY 
                   TeamID,
                   FirstName
                  FOR XML PATH( '' )
                 ), 3, 1000 )FROM TeamInfo t1
    GROUP BY TeamID
     
    -- Sonuçlar
    TeamID MemberList
    1    Bob, Jim, Mary
    2    Ellen, Ralph, Sue
    3    Bill, Linda
    
    

    SQL Server 2000 Çözümü

    CREATE FUNCTION dbo.fnMakeTeamList
      ( @TeamID int )
      RETURNS varchar(1000)
    AS
      BEGIN
       DECLARE @TempTeam table
         ( Firstname varchar(20) )
       DECLARE @TeamList varchar(1000)
       SET @TeamList = ''
       INSERT INTO @TempTeam
         SELECT FirstName
         FROM TeamInfo
         WHERE TeamID = @TeamID
       IF @@ROWCOUNT > 0
         UPDATE @TempTeam
          SET @TeamList = ( @TeamList + FirstName + ', ' )
       RETURN substring( @TeamList, 1, ( len( @TeamList ) - 1 ))
      END
     
    
    SELECT 
      TeamID, 
      MemberList = dbo.fnMakeTeamList( TeamId ) 
    FROM TeamInfo 
    GROUP BY TeamID
     
    -- Sonuçlar
    TeamID   MemberList
    1    Jim, Mary, Bob
    2    Sue, Ralph, Ellen
    3    Bill, Linda
    
    

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:36
    Moderatör
     
      Kod İçerir

    7) Verilerin bütününün getirilmesi yerine belirli bir aralıktaki kayıtları getirme

     

    Büyük veritabanları ile çalışıldığında verilerin uygulamaya getirilmesi zaman açısından sorun oluşturabilir.  Verinin görüntülenmesinde en sıklıkla kullanılan DataGridView/GridView kontrolleri ile sayfalama yapıldığını düşünelim bir kerede kullanıcıya 10 satır görüntülenecek ise tüm verinin getirilmesi yerine 10'ar 10'ar getirilmesini sağlayacak bir saklı yordam yazarak bu işlem hızlandırılabilir.

     

    SQL Server 2005/2008 için ROW_NUMBER() fonksiyonunu kullanan,SQL Server 2000 için ise bir tablo değişkeninin kullanıldığı T-SQL çözümünü gösteren aşağıdaki örnekleri inceleyelim :

     

     

    SQL Server 2005/2008 Çözümü :

     

    DECLARE     @Start datetime,
        @End datetime
     
    SELECT    @Start = 11,
        @End = 20
     
    ;WITH ObjectsTABLE AS
    (
     SELECT ROW_NUMBER() OVER (ORDER BY name) AS Row, 
            convert(varchar(30), name) as objName,
            crDate
     FROM sysobjects
    )
     
    SELECT    objName, CrDate
    FROM ObjectsTable
    WHERE Row >= @Start AND Row <= @End
     
    /* Sonuçlar
    objName            CrDate
    ------------------------------ -----------------------
    assembly_modules        2007-02-10 00:23:25.353
    assembly_references      2007-02-10 00:23:29.183
    assembly_types         2007-02-10 00:23:27.870
    asymmetric_keys        2007-02-10 00:23:52.917
    backup_devices         2007-02-10 00:23:41.870
    certificates          2007-02-10 00:23:52.260
    check_constraints       2007-02-10 00:23:20.760
    CHECK_CONSTRAINTS       2007-02-10 00:27:23.027
    COLUMN_DOMAIN_USAGE      2007-02-10 00:27:21.060
    COLUMN_PRIVILEGES       2007-02-10 00:27:21.387
    */
    
    

     

    SQL Server 2000 Çözümü :

     

    DECLARE     @Start datetime,
        @End datetime
     
    SELECT    @Start = 11,
        @End = 20
     
    DECLARE @PagingTable TABLE
    (Row int identity primary key,
     objName varchar(30),
     crDate datetime)
     
    INSERT INTO @PagingTable (objName, crDate)
    SELECT    convert(varchar(30), name) as objName,
            crDate
    FROM sysobjects
    ORDER BY Name
     
    SELECT    objName, CrDate
    FROM @PagingTable
    WHERE Row >= @Start AND Row <= @End
     
    /* Sonuçlar
    objName            CrDate
    ------------------------------ -----------------------
    assembly_modules        2007-02-10 00:23:25.353
    assembly_references      2007-02-10 00:23:29.183
    assembly_types         2007-02-10 00:23:27.870
    asymmetric_keys        2007-02-10 00:23:52.917
    backup_devices         2007-02-10 00:23:41.870
    certificates          2007-02-10 00:23:52.260
    check_constraints       2007-02-10 00:23:20.760
    CHECK_CONSTRAINTS       2007-02-10 00:27:23.027
    COLUMN_DOMAIN_USAGE      2007-02-10 00:27:21.060
    COLUMN_PRIVILEGES       2007-02-10 00:27:21.387
    */
    
    

    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:40
    Moderatör
     
      Kod İçerir

    8) Her grup için Top N kaydın seçilmesi

    Her kategori/grup için çok satırlı verilerin bulunduğu ortamlarda örneğin "her kategoriden en pahalı 2 ürünü" listelemek benzeri işlemlerin yapılması istenebilir. Örnek tablo ve istenen çıktı :

     

     

     

    RowID

    Category

    ID

    Description

    Price

    1

    Pot

    A1

    Small Saucepan

    21.50

    2

    Pot

    A2

    1 Qt Saucepan

    29.95

    3

    Pot

    A3

    1.5 Qt Saucepan

    33.95

    4

    Pot

    A4

    Double Boiler

    39.50

    5

    Pot

    A5

    Stewpot

    49.50

    6

    Pot

    A6

    Pressure Cooker

    79.95

    7

    Pan

    B1

    8" Pie

    6.95

    8

    Pan

    B2

    8" Sq Cake

    7.50

    9

    Pan

    B3

    Bundt Cake

    12.50

    10

    Pan

    B4

    9x12 Brownie

    7.95

    11

    Bowl

    C1

    Lg Mixing

    27.50

    12

    Bowl

    C2

    Sm Mixing

    17.50

    13

    Tools

    T1

    14" Spatula

    9.95

     

     

    RowID

    Category

    ID

    Description

    Price

    11

    Bowl

    C1

    Lg Mixing

    27.50

    12

    Bowl

    C2

    Sm Mixing

    17.50

    9

    Pan

    B3

    Bundt Cake

    12.50

    10

    Pan

    B4

    9x12 Brownie

    7.95

    6

    Pot

    A6

    Pressure Cooker

    79.95

    5

    Pot

    A5

    Stewpot

    49.50

    13

    Tools

    T1

    14" Spatula

    9.95

     

     

    Önce üzerinde çalışacağımız verileri oluşturalım :

    SET NOCOUNT ON
     
    
    DECLARE @MyTable table
      ( RowID     int  IDENTITY, 
       Category   varchar(5),
       [ID]     varchar(5),
       [Description] varchar(25),
       Price     decimal(10,2)
      )
     
     
    INSERT INTO @MyTable VALUES ( 'Pot', 'A1', 'Small Saucepan', 21.50 )
    INSERT INTO @MyTable VALUES ( 'Pot', 'A2', '1 Qt Saucepan', 29.95 )
    INSERT INTO @MyTable VALUES ( 'Pot', 'A3', '1.5 Qt Saucepan', 33.95 )
    INSERT INTO @MyTable VALUES ( 'Pot', 'A4', 'Double Boiler', 39.50 )
    INSERT INTO @MyTable VALUES ( 'Pot', 'A5', 'Stewpot', 49.50 )
    INSERT INTO @MyTable VALUES ( 'Pot', 'A6', 'Pressure Cooker', 79.95 )
    INSERT INTO @MyTable VALUES ( 'Pan', 'B1', '8"" Pie', 6.95 )
    INSERT INTO @MyTable VALUES ( 'Pan', 'B2', '8"" Sq Cake', 7.50 )
    INSERT INTO @MyTable VALUES ( 'Pan', 'B3', 'Bundt Cake', 12.50 )
    INSERT INTO @MyTable VALUES ( 'Pan', 'B4', '9x12 Brownie', 7.95 )
    INSERT INTO @MyTable VALUES ( 'Bowl', 'C1', 'Lg Mixing', 27.50 )
    INSERT INTO @MyTable VALUES ( 'Bowl', 'C2', 'Sm Mixing', 17.50 )
    INSERT INTO @MyTable VALUES ( 'Tools', 'T1', '14"" Spatula', 9.95 )
    
    

    SQL Server 2005/2008 Çözümü :

    SELECT
      RowID,
      Category,
      [ID],
      [Description],
      Price
    FROM (SELECT
         ROW_NUMBER() OVER ( PARTITION BY Category ORDER BY Price DESC ) AS 'RowNumber',
         RowID,
         Category,
         [ID],
         [Description],
         Price
       FROM @MyTable
       ) dt
    WHERE RowNumber <= 2
     
    -- Sonuçlar
    RowID Category ID Description   Price
    11  Bowl   C1 Lg Mixing    27.50
    12  Bowl   C2 Sm Mixing    17.50
    9   Pan    B3 Bundt Cake   12.50
    10  Pan    B4 9x12 Brownie  7.95
    6   Pot    A6 Pressure Cooker 79.95
    5   Pot    A5 Stewpot     49.50
    13  Tools   T1 14" Spatula   9.95
    
    

    SQL Server 2000 Çözümü

     

    SELECT DISTINCT
      RowID,
      Category,
      [ID],
      [Description],
      Price
    FROM @MyTable t1
    WHERE RowID IN (SELECT TOP 2
              RowID
            FROM @MyTable t2
            WHERE t2.Category = t1.Category
            ORDER BY Price DESC
            )
    ORDER BY 
      Category,
      Price DESC
     
    -- Sonuçlar
    RowID Category ID Description   Price
    11  Bowl   C1 Lg Mixing    27.50
    12  Bowl   C2 Sm Mixing    17.50
    9   Pan    B3 Bundt Cake   12.50
    10  Pan    B4 9x12 Brownie  7.95
    6   Pot    A6 Pressure Cooker 79.95
    5   Pot    A5 Stewpot     49.50
    13  Tools   T1 14" Spatula   9.95
    
    

    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:41
    Moderatör
     
      Kod İçerir

    9) Tüm kullanıcı tanımlı veritabanlarının detach edilmesi

     

    SET NOCOUNT ON
     
    DECLARE 
      @dbName   varchar(80),
      @ServerName varchar(20)
     
    SELECT @ServerName = @@servername
     
    DECLARE dbCursor CURSOR FOR 
      SELECT name 
      FROM master.dbo.sysdatabases 
      WHERE name NOT IN ( 'model', 'master', 'msdb', 'tempdb', 'distribution', 'repldata' )
     
    OPEN dbCursor 
     
    FETCH NEXT FROM dbCursor INTO @dbName
     
    IF ( @@FETCH_STATUS <> 0 )
      PRINT 'Kullanıcı Tanımlı Veritabanı Bulunamadı'
      
    WHILE ( @@FETCH_STATUS = 0 )
      BEGIN
       DECLARE @SQLStr varchar(8000) 
       SET @SQLStr = 
        'DECLARE 
          @SPIDStr  varchar(8000),
          @ConnKilled smallint
         SELECT 
          @ConnKilled = 0
          @SPIDStr  = ''''
         SELECT @SPIDStr = coalesce( @SPIDStr, '', '' ) + ''KILL '' + convert( varchar, spid ) + ''; ''
         FROM master.dbo.sysprocesses 
         WHERE dbid = db_id( ''' + @dbName + ''' )
         IF LEN( @SPIDStr ) > 0 
          BEGIN
            EXECUTE( @SPIDStr )
            SELECT @ConnKilled = COUNT(1)
            FROM master..sysprocesses 
            WHERE dbid = db_id( ''' + @dbName + ''' )
          END' + char(10) + ';' + char(10) + 
        'EXECUTE sp_detach_db ' + @dbName
       EXECUTE ( @SQLStr )
       PRINT upper( @dbName ) + ' Veritabanının Detach işlemi sonlandırıldı.'
       PRINT ''
       FETCH NEXT FROM dbCursor INTO @dbName
      END
      
    CLOSE dbCursor
    DEALLOCATE dbCursor
     
    PRINT ' '
    PRINT upper( @ServerName ) + ' -->Tüm Kullanıcı tanımlı Veritabanları Kaldırıldı'
    
    

    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:43
    Moderatör
     
      Kod İçerir

    10) Sunucu üzerindeki veritabanlarının en son yedek alınma tarihini öğrenme

    Bir yedek alma işlemi yapıldığında SQL Server  msdb.dbo.backupfile, msdb.dbo.backupmediafamily, msdb.dbo.backupmediaset ve msdb.dbo.backupset tablolarını günceller.

     

    Bu tabloları kullanarak veritabanlarınız hakkında bilgi edinebilirsiniz. Aşağıdaki sorgu ile veritabanı ismi en son alınan yedek tarihi ve yedeği kimin aldığı gibi bilgiler listelenmektedir.

    SELECT 
    T1.Name as DatabaseName, 
    COALESCE(Convert(varchar(12), MAX(T2.backup_finish_date), 101),'Not Yet Taken') as LastBackUpTaken,
    COALESCE(Convert(varchar(12), MAX(T2.user_name), 101),'NA') as UserName
    FROM sys.sysdatabases T1 LEFT OUTER JOIN msdb.dbo.backupset T2
    ON T2.database_name = T1.name
    GROUP BY T1.Name
    ORDER BY T1.Name
    
    

     

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:47
    Moderatör
     
      Kod İçerir

    11) En uzun sürede işletilen prosedürlerin bulunması

    Çoğu zaman hangi prosedürlerin ya da sorguların Server üzerine en fazla yük bindirdiği bilinmek istenir. Bu yük bazen giriş/çıkış işlemlerinin yükü bazen işlem süresi ile ölçülür.

     

    Aşağıdaki örnekte 10 prosedürün bazı etkenler baz alınarak yapılan karşılaştırması gösterilmiştir.

     

    SQL Server 2005/2008 Çözümü :

    SELECT TOP 10 
      ProcedureName  = t.text, 
      ExecutionCount  = s.execution_count, 
      AvgExecutionTime = isnull( s.total_elapsed_time / s.execution_count, 0 ),
      AvgWorkerTime  = s.total_worker_time / s.execution_count,
      TotalWorkerTime = s.total_worker_time,
      MaxLogicalReads = s.max_logical_reads, 
      MaxLogicalWrites = s.max_logical_writes, 
      CreationDateTime = s.creation_time,
      CallsPerSecond  = isnull( s.execution_count / datediff( second, s.creation_time, getdate()), 0 )
    FROM sys.dm_exec_query_stats s
      CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t
    -- WHERE ...
    ORDER BY 
      s.total_elapsed_time DESC
    
    

     

    Alınan çıktı :

     

    ProcedureName

    ExecutionCount

    AvgExecutionTime

    AvgWorkerTime

    TotalWorkerTime

    MaxLogicalReads

    MaxLogicalWrites

    CreationDateTime

    CallsPerSecond

    Exec Proc1

    1

    3723204

    3596939

    3596939

    36249

    112

    2008-03-25 00:04:15.950

    0

    Exec Proc2

    1

    2512181

    2389573

    2389573

    703

    0

    2008-03-24 23:59:15.980

    0

    Exec Proc3

    1

    1080008

    971041

    971041

    443

    0

    2008-03-25 00:16:07.820

    0

    Exec Proc4

    1

    1032135

    935483

    935483

    223

    0

    2008-03-25 00:13:55.193

    0

    Exec Proc5

    1

    955338

    912818

    912818

    223

    0

    2008-03-25 00:15:06.617

    0

    Exec Proc6

    1

    946446

    906498

    906498

    346

    0

    2008-03-25 00:15:33.227

    0

    Exec Proc7

    1

    635835

    634566

    634566

    561

    0

    2008-03-24 23:22:00.280

    0

    Exec Proc8

    1

    481766

    475023

    475023

    36202

    105

    2008-03-25 00:13:55.180

    0

    Exec Proc9

    1

    349026

    343143

    343143

    36202

    105

    2008-03-25 00:15:06.600

    0

    Exec Proc10

    1

    346581

    337336

    337336

    36202

    105

    2008-03-25 00:15:33.227

    0

     

     

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:50
    Moderatör
     
      Kod İçerir

    12) Sunucu üzerindeki sabit disklerde kalan boş alanı öğrenme

    Disk alanı SQL Server üzerinde birçok faktörden dolayı  çoğu zaman en değerli varlıktır. Depolama için Storage Area Network (SAN) Kullanan sunucularda ekstra depolama alanı için yapılacak genişlemeler  kolay olabilir ancak bu SAN üzerinde boş alanın olup olmamasına bağlıdır. Direct Attached Storage (DAS) kullanan sunucular üzerinde yapılacak genişlemeler çok daha zor olabilir.  Bu durumda sunucunun uzun süre down olması ve var olan disklerin daha genişleri ile değiştirilmesi ya da sunucuya harici bir disk eklenmesi gerekir,bunların hiçbiri genelde maliyeti düşük olan işlemler değildir ve doğru zamanda bu işlemlerin yapılmasını planlamak için DBA'in kalan disk alanını monitor edebilmesi çok önemli bir gereklilik olarak karşımıza çıkar.

     

    İlk olarak kullanılabilecek yöntem xp_fixeddrives komutu. Herhangi bir parametre istemeyen bu komut çalıştırıldığında Mountpoint diskler haricinde harf ile atanan diskler hakkında bilgi alınabilir. Bu komut undocumented bir komut olduğundan ne zamana kadar destekleneceğinin bilinmediğini de unutmamak gerekli.

     

    İkinci olarak SQL Server üzerinde kalan disk alanını belirlemek için COM FileSystemObject sınıfı kullanılarak işletim sistemine çağrılar yapılabilir. Aşağıdaki saklı yordam ile disk üzerindeki boş alan yüzde 15'in altına düştüğünde bilgilendirme yapılması öngörülmüştür. Aşağıdaki kodda değişiklik yaparak bu oranı değiştirebilir alacağınız uyarı mesajını kişiselleştirebilirsiniz.

    CREATE PROCEDURE [dbo].[GetDiskSpaceStats] (@RunLocal bit = 0)
    AS 
    BEGIN 
     
    IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE name = 'DiskSpaceStats' AND type='U') 
    BEGIN 
        CREATE TABLE [dbo].[DiskSpaceStats] 
        ( 
            DriveLetter        char(1),
            TotalSize        decimal(20,0),
            AvailableBytes    decimal(20,0),
            DriveType        char(10),
            PercentFree        decimal(18,3),
            Report_Date        datetime default getdate() 
        )
        ON [PRIMARY]
    END 
     
    IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#DiskSpace%') 
    DROP TABLE #DiskSpace 
    CREATE TABLE #DiskSpace
    (
        RowID int Identity Primary Key, 
        DriveLetter char(1),
        TotalSize decimal(20,0),
        AvailableBytes decimal(20,0),
        DriveType char(10),
        PercentFree decimal(18,3)
    )
     
    DECLARE @counter int
    DECLARE @FSOobject int
    DECLARE @RecordCount int
    DECLARE @count int
    DECLARE @string char(35)
    DECLARE @DriveLetter char(1)
    DECLARE @TotalSize char(50)
    DECLARE @AvailableSpace char(50)
    DECLARE @DriveType char(10)
    DECLARE @error int
    DECLARE @hr int
    DECLARE @src varchar(255), @desc varchar(255)
    DECLARE @ServerName sysname
     
    SET @ServerName = @@ServerName
    SET @count=0
    SET @counter=67
    SET @error=0
        
    EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @FSOobject OUT
     
    IF @hr <> 0
        BEGIN
            EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT
            PRINT @desc
            RETURN
        END
     
    WHILE @counter < 91 OR @error <3
        BEGIN
            SET @String='Drives.item("'+char(@counter)+'").DriveLetter'
            EXEC @HR = sp_OAGetProperty @FSOobject, @String, @DriveLetter OUT
            IF @HR <> 0
                BEGIN
                    EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT
                    SELECT @counter=@counter+1
                    SELECT @error=@error +1
                    GOTO ErrorPoint
                END
     
            SET @String='Drives.item("'+char(@counter)+'").TotalSize'
            EXEC @HR = sp_OAGetProperty @FSOobject, @string, @TotalSize OUT
            IF @HR <> 0
                BEGIN
                    EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT
                    SELECT @counter=@counter+100
                    SELECT @error=1
                END 
     
            SET @String='Drives.item("'+char(@counter)+'").AvailableSpace'
            EXEC @HR = sp_OAGetProperty @FSOobject, @string, @AvailableSpace OUT
            IF @HR <> 0
                BEGIN
                    EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT
                    PRINT @desc
                    RETURN
                END
     
            SET @String='Drives.item("'+char(@counter)+'").DriveType'
            EXEC @HR = sp_OAGetProperty @FSOobject, @String, @DriveType OUT
            IF @HR <> 0
                BEGIN
                    EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT
                    PRINT @desc    
                    RETURN
                END
     
            IF @Error < 3
                BEGIN
                    INSERT INTO #DiskSpace (DriveLetter, TotalSize, AvailableBytes, DriveType, PercentFree)
                    VALUES (@DriveLetter, @TotalSize, @AvailableSpace, @DriveType, (convert(decimal(20,0), @AvailableSpace)/convert(decimal(20,0), @TotalSize)))
                END
     
            SELECT @counter=@counter+1
        END
     
    ErrorPoint:
     
    INSERT INTO [dbo].[DiskSpaceStats] (DriveLetter, TotalSize, AvailableBytes, DriveType, PercentFree)
    SELECT DriveLetter, TotalSize, AvailableBytes, DriveType, PercentFree 
    FROM #DiskSpace
     
        EXEC @hr = sp_OADestroy @FSOobject
        IF @hr <> 0
            BEGIN
                EXEC sp_OAGetErrorInfo @FSOobject
            RETURN
        END
     
    IF @RunLocal = 1
    BEGIN
     SELECT * FROM #DiskSpace
    END
    ELSE
    BEGIN
     
            DECLARE @Loop int
            DECLARE @Subject varchar(100)
            DECLARE @strMsg varchar(4000)
     
            SELECT @Subject = 'SQL Monitor Alert: ' + @@servername
     
            SELECT @Loop = min(RowID)
            FROM #DiskSpace
            WHERE PercentFree <= .15
     
            WHILE @Loop IS NOT NULL
            BEGIN
     
                SELECT     @strMsg = convert(char(15),'Drive:') + isnull(DriveLetter, 'Unknown') + char(10) +
                        convert(char(15),'') + convert(varchar, convert(decimal(18,1), PercentFree*100)) + '% free space remaining.'+ char(10) +
                        convert(char(15),'') + char(10) +
                        convert(char(15),'EventTime:') + convert(varchar, getdate())
                FROM #DiskSpace
                WHERE RowID = @Loop
     
                EXEC dbo.SendEmailNotification @Subject, @strMsg
     
                SELECT @Loop = min(RowID)
                FROM #DiskSpace
                WHERE PercentFree <= .15
                 AND RowID > @Loop
     
            END
     
    END
     
    DROP TABLE #DiskSpace
     
    END
    
    

    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:52
    Moderatör
     
      Kod İçerir

    13) Veritabanı dosyaları üzerinde kalan boş alanı öğrenme

    Veritabanı dosyaları üzerinde kalan boş alanın takip edilmesi bir DBA için çok önemli bir iştir. Veritabanlarından birinin içindeki filegrouplarda boş datafile kalmadıysa ve otomatik büyüme "autogrowth" aktifleştirilmiş ise veritabanına ekstra alan tanımlanana kadarki süreçte birçok hata mesajı ile karşılaşacağınız neredeyse kesindir.

     

    DBA'in veritabanı üzerinde kalan boş alanı monitör etmesinin birçok nedeni vardır. Öncelikle veritabanı üzerindeki verinin artması performansla direk ilişkilidir.  Bir başka neden ise boyut planlama olarak gösterilebilir. DBA veritabanı üzerindeki verinin boyutuna bakarak autogrowth değerinin büyüklüğünü önceden planlayabilir böylece birden çok autogrowth işlemi yerine bu işlemin 1 kerede yapılması ya da tam tersi gibi ihtiyaçlar karşılanmış olur.

    CREATE PROCEDURE [dbo].[GetFileSpaceStats] (@RunLocal bit = 0)
    AS
    BEGIN 
     
    /*
    DECLARE @RunLocal bit
    SET @RUnLocal = 1
    */
    DECLARE @dbName sysname 
     
    IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE name = 'FileSpaceStats' AND type='U') 
    BEGIN 
     CREATE TABLE [dbo].[FileSpaceStats] 
     ( 
      Server_Name sysname NOT NULL, 
      dbName sysname NOT NULL, 
      Flag bit NULL, 
      Fileid tinyint NULL, 
      FileGroup sysname NULL, 
      Total_Space decimal(20, 1) NULL, 
      UsedSpace decimal(20, 1) NULL, 
      FreeSpace decimal(20, 1) NULL, 
      FreePct decimal(20, 3) NULL, 
      Name varchar(250) NULL, 
      FileName sysname NULL , 
      Report_Date datetime default getdate() 
     )
     --ON PRIMARY 
    END 
     
    IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#FileSpaceStats%') 
    BEGIN
     DROP TABLE #FileSpaceStats 
    END
     
    CREATE TABLE #FileSpaceStats
    (
     RowID int IDENTITY PRIMARY KEY, 
     Server_Name sysname NOT NULL, 
     dbName sysname NOT NULL, 
     Flag bit NULL, 
     Fileid tinyint NULL, 
     FileGroup sysname NULL, 
     Total_Space decimal(20, 1) NULL, 
     UsedSpace decimal(20, 1) NULL, 
     FreeSpace decimal(20, 1) NULL, 
     FreePct decimal(20, 3) NULL, 
     Name varchar(2500) NULL, 
     FileName sysname NULL , 
     Report_Date datetime default getdate()
    )
     
     
    IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#DataFileStats%') 
    BEGIN
     DROP TABLE #DataFileStats 
    END
     
    CREATE TABLE #DataFileStats 
    ( 
     RowID int IDENTITY PRIMARY KEY,
     Flag bit default 0, 
     Fileid tinyint, 
     FileGroup tinyint, 
     TotalExtents dec (20, 1), 
     UsedExtents dec (20, 1), 
     Name varchar(250), 
     FileName sysname 
    ) 
     
    IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#LogSpaceStats%') 
    BEGIN
     DROP TABLE #LogSpaceStats 
    END
    CREATE TABLE #LogSpaceStats 
    ( 
     RowID int IDENTITY PRIMARY KEY,
     dbName sysname, 
     Flag bit default 1, 
     Totallogspace dec (20, 1), 
     UsedLogSpace dec (20, 1), 
     Status char(1) 
    ) 
     
    DECLARE @string sysname 
    DECLARE cur_dbName CURSOR FOR 
     
    SELECT name 
    FROM master..sysdatabases
     
    OPEN cur_dbName 
     
    FETCH NEXT FROM cur_dbName into @dbName 
    WHILE @@FETCH_Status=0 
    BEGIN 
     
     DELETE #DataFileStats
     
     SET @string = 'USE [' + @dbName + '] DBCC SHOWFILESTATS WITH NO_INFOMSGS' 
     
     INSERT INTO #DataFileStats (Fileid, FileGroup, TotalExtents, UsedExtents, Name, FileName) 
     EXEC (@string) 
     
     INSERT #FileSpaceStats (Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, 
              UsedSpace, FreeSpace, FreePct, Name, FileName)
     
     SELECT @@SERVERNAME, @dbName, Flag, Fileid, FileGroup_Name(FileGroup), (TotalExtents*64/1024), 
       (UsedExtents*64/1024), ((TotalExtents*64/1024)-(UsedExtents*64/1024)),
       (((TotalExtents*64/1024)-(UsedExtents*64/1024))*100/(TotalExtents*64/1024))/100,
       Name, FileName
     FROM #DataFileStats 
     
    FETCH NEXT FROM cur_dbName into @dbName 
    END 
    CLOSE cur_dbName 
    DEALLOCATE cur_dbName 
     
     
     
    INSERT #LogSpaceStats (dbName, Totallogspace, UsedLogSpace, Status) 
    EXEC ('DBCC sqlperf(logspace) WITH NO_INFOMSGS') 
     
    INSERT #FileSpaceStats (Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, 
         UsedSpace, FreeSpace, FreePct, Name, FileName)
    SELECT @@SERVERNAME, dbName, Flag, 0, 'LOG', Totallogspace, (TotalLogSpace*(UsedLogSpace/100)),
      (TotalLogSpace-(TotalLogSpace*(UsedLogSpace/100))), (100-UsedLogSpace)/100, dbName+'_Log',
      dbName+'_Log.ldf'
    FROM #LogSpaceStats 
     
    INSERT dbo.FileSpaceStats 
     (Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, UsedSpace, 
      FreeSpace, FreePct, Name, FileName)
    SELECT Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, UsedSpace, 
      FreeSpace, FreePct, Name, FileName
    FROM #FileSpaceStats
     
    IF @RunLocal = 1
    BEGIN
     SELECT * FROM #FileSpaceStats
    END
    ELSE
    BEGIN 
      DECLARE @Loop int
      DECLARE @Subject varchar(100)
      DECLARE @strMsg varchar(4000)
     
      SELECT @Subject = 'SQL Monitor Alert: ' + @@servername
     
      SELECT @Loop = min(RowID)
      FROM #FileSpaceStats
      WHERE FreePct <= .10
     
      WHILE @Loop IS NOT NULL
      BEGIN
     
       SELECT  @strMsg = convert(char(15),'Database:') + isnull(dbName, 'Unknown') + char(10) +
         convert(char(15),'FileGroup:') + isnull(FileGroup, 'Unknown') + char(10) +
         convert(char(15),'FileName:') + isnull(Name, 'Unknown') + char(10) +
         convert(char(15),'') + convert(varchar, convert(decimal(18,1), FreePct*100)) + '% boş yer bulunmaktadur.'+ char(10) +
         convert(char(15),'') + char(10) +
         convert(char(15),'EventTime:') + convert(varchar, getdate())
       FROM #FileSpaceStats
       WHERE RowID = @Loop
     
       EXEC dbo.SendEmailNotification @Subject, @strMsg
     
       SELECT @Loop = min(RowID)
       FROM #FileSpaceStats
       WHERE FreePct <= .10
        AND RowID > @Loop
     
      END
     
    END
     
    DROP TABLE #FileSpaceStats
    DROP TABLE #DataFileStats 
    DROP TABLE #LogSpaceStats 
     
    END 
    
    

    SP” SendEmailNotification” :

    CREATE PROCEDURE [dbo].[SendEmailNotification]
     @Subject varchar(4000),
     @Body varchar(4000),
     @Attachment varchar(4000) = " "
    AS
     
    DECLARE @From varchar(4000)
    DECLARE @To varchar(4000)
     
    SELECT @From = '"SQLMonitor" <monitor@domain.com>',
    		@To = '"SQL DBA" <sqldba@domain.com>'
     
    EXECUTE [dbo].[Send_CDOSysMail] 
     @From
     ,@To
     ,@Subject
     ,@Body
     ,@Attachment
    
    


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 01 Şubat 2011 Salı 13:55
    Moderatör
     
      Kod İçerir

    14) Devam eden process bilgilerini almak

     

     

    select  SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
      ((CASE qs.statement_end_offset
       WHEN -1 THEN DATALENGTH(st.text)
       ELSE qs.statement_end_offset
       END - qs.statement_start_offset)/2) + 1) AS statement_text, *
     from sys.dm_exec_requests qs
    cross apply sys.dm_exec_sql_text(sql_handle) st
    cross apply sys.dm_exec_query_plan(plan_handle)
    
    

     

     

     


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


  • 20 Ağustos 2011 Cumartesi 11:27
     
     

    Emre Bey Kolay Gelsin Bi Sorum Olucaktı

    4) Saklı yordamın (stored procedure) aynı anda sadece 1 kere kullanıldığından emin olmak

     10  sn içinde hata vermek yerine birincisinin bitmesini bekledikten sonra nasıl çalistirabilirm Yada sadece secilen satiri 10 saniyeliğine nasıl kilitleyebilrim

    Tesekkurler.. 


  • 21 Aralık 2011 Çarşamba 11:15
     
     
    10 saniyeliğine bende durdurmak isterim ..
    firmakurdu.com
  • 14 Şubat 2012 Salı 09:58
     
     
    faydalı bilgiler sunun herkese teşekkürler.