SQL'de belirli bir tip kolonların listesi nasıl alınır?

March 21, 2010 at 8:03 PMoozturk

Merhaba,

 

Bir hazır veritabanınız var ve belirli bir tipteki kolonları listelemeye ihtiyacınız var (mesela bu tipteki kolonların tipini değiştirmeniz gerekiyor), peki bunu nasıl yapacaksınız?

 

Script 1: Belirli bir kolon tipine ait kolonların listesini alırken sadece tablo adı ve kolon adını görmek istiyorsanız

SELECT OBJECT_NAME(c.OBJECT_IDTabloAdic.name KolonAdi
FROM sys.columns 
AS c
JOIN sys.types 
AS ON c.user_type_id t.user_type_id
WHERE t.name 
'text'
ORDER BY 
c.OBJECT_ID;

Script 2: Aynı şartlar altında bir liste almak istiyorsunuz ancak daha detaylı veriye ihtiycanız varsa

SELECT

OBJECT_NAME(c.OBJECT_ID) TabloAdi

,c.name AS Kolonadi

,SCHEMA_NAME(t.schema_id) AS SchemaAdi

,t.name AS Tip

,t.is_user_defined

,t.is_assembly_type

,c.max_length

,c.PRECISION

,c.scale

FROM sys.columns AS c

JOIN sys.types AS t ON c.user_type_id=t.user_type_id

WHERE t.name = 'date'

ORDER BY c.OBJECT_ID;

Bu kadar basit. Bu iki komuttan işinize yarayan biri ile istediğiniz veritabanına ait tablolar içinden istediğiniz veri tipindeki kolonları tespit edebilirsiniz.

 

İyi günler.

Posted in: MSSQL

Tags:

Union ve Union All arasındaki fark nedir?

June 13, 2009 at 6:05 PMoozturk

Union yalnızca tekrarlanmayan verileri alırken union all herhangi bir filtre uygulamadan bütün verileri kapsar. O kadar.

Posted in: MSSQL

Tags:

Visual Studio Team Foundation Server 2008 kurulumuna SP1'i entegre etmek

February 24, 2009 at 11:20 AMoozturk

Merhaba,

Bu işlem için gerekli adımları yazıyorum.

  - Öncelikle Elinizdeki TFS sürümüne uygun sp1'i microsoft.com sitesinden indirin.

  - TFS kurulum dvd'sindeki dosyaların tümünü bilgisayrınızda boş bir klasöre kopyalayın. (Ben D:\tfssetup klasörünü kullanıyorum bu yazıda)

  - TFS SP1 için çektiğiniz dosyayı, yine boş bir klasöre aşağıdaki komut ile açın (Ben D:\tfssp1 klasörünü kullanıyorum bu yazıda)

      - en_visual_studio_team_system_2008_team_foundation_server_service_pack_1_x86_x64wow.exe /extract:D:\tfssp

  - Şimdi dosyaları birleştireceğiz. Bunun için yine boş bir klasöre ihtiyacımız var. (Ben D:\sp1integrated klasörünü kullanıyorum bu yazıda)

      - Sp1'i açtığınız klasörde (D:\tfssp1) aşağıdaki komutu çalıştırın.

      - msiexec /a d:\tfssetup\AT\vs_setup.msi /p TFS90sp1-KB949786.msp TARGETDIR=d:\sp1integrated\AT

  - Artık elimizde AT klasörü var, D:\tfssetup klasöründen AT haricindeki bütün dosyaları d:\sp1integrated klasörüne kopyalayın.

  - Herhangi bir CD/DVD ISO yazıcısıyla bu klasörün içeriğini bir ISO dosyası olarak kaydedin ve daha sonra bir DVD'ye yazın.

  - Artık içine SP1 eklenmiş bir DVD'niz var. Diğer kurulum detayları için Visual Studio 2008 Team Foundation Server Kurulumunda Sorunlarla Karşılaşıyorum Ne Yapmalıyım? başlıklı yazıma bakabilirsiniz.

Posted in: MSSQL | Visual Studio

Tags: , , , , ,

Visual Studio 2008 Team Foundation Server Kurulumunda Sorunlarla Karşılaşıyorum Ne Yapmalıyım?

February 24, 2009 at 10:51 AMoozturk

Merhaba,

Öncelikle zor bir kurulum ile karşı karşıya olduğunuzu bilin. Daha sonra, kesinlikle karşınıza kurulum için yardım dosyasını açın ve kurmak istediğiniz versiyonunun kurulum gereksinimlerine bakın. Bunlardan önemli olanlarını buraya yazıyorum.

  -  SQL Server 2005 / 2008, Standart / Enterprise Kurun.

      - Bütün servislerini kurun, çünkü hepsini kullanıyor. Kurarken de servisleri çalıştıracak hesap olarak Local Service seçin.

      - SQL Server Collation ayarlarında Case-Insensitive, Accent-Sensitive yaptığınızdan emin olun, SQL Server kurulduktan sonra değiştiremezsiniz çünkü.

      - SQL'i daha önce kurduysanız ve eğer diğer servisleri kurmadıysanız, kurulumunuzu modifiye edin ve eksiklerinizi kurun.

      - SQL Server 2005 kullanıyorsanız mutlaka SP1 kurun.

      - Eğer sorun yaşamak istemiyorsanız bir named instance kullanmayın (örn. OzkanLaptop\TFS), Default kullanın (örn. OzkanLaptop)

      - Bütün servislerin startup değerlinin otomaik olduğundan ve kurulum esnasında çalışıyor olduğundan emin olun.

      - SQL Management Studio ile servislere bağlanabildiğinizden emin olun.

      - SQL Server Configuration Manager üzerinde network ayarlarındanTCP/IP'nin açık olduğundan emin olun.

  -  TFSReport, TFSSharepoint gibi kullanıcılar yaratmanız gerektiği zaten yazıyor yardım dosyasında, bunu okduğunuzu varsayıyorum.

  - Windows Update ile güncelleştirmeleri sonuna kadar yükleyin, başka sorunlar çıkabiliyor.

  - Eğer firewall kullanıyorsanız (windows firewall, eset, ..) mutlaka kurulum için gerekli portları açın ya da kurulum esnasında firewall'unuzu kapatın.

Eğer bütün donanımınız yeterliyse, yukarında belirttiğim ve yardım dosyasında yazan diğer detayları doğru biçimde yaptıysanız dahi yine de kuramayabilirsiniz. Bunun sebebi de bu kurulumun SQL Server 2005 SP1 üstünü desteklememesinden kaynaklanıyor olabilir, ayrıca SQL Server 2008'de desteklemiyor zaten. Eğer SQL Server 2005'de SP2 veya üstü bir sürüm kullanıyorsanız ya da SQL Server 2008 kullanıyorsanız, kuruluma sp1'i entegre etmeniz gerekiyor demektir. Bunun için de Visual Studio Team Foundation Server 2008 kurulumuna SP1'i entegre etmek başlıklı yazımı okuyun ve kurulumu o şekilde deneyin.

Eğer 32000 hata kodu alıyorsanız birden çok sebebi olabilir. (Netice de temel sebeb, 0 değer döndürmesi gereken bir işlemin 0'dan farklı bir değer döndürmesi ancak birden çok sebeple 0'dan farklı sebep döndüren işlemler var, bu sebeple bu hatayı alma sebebiniz birden fazla olabilir.)

  - Eğer daha önce bir hatalı kurulum yaptıysanız, mutlaka IIS'den klasöründen kurulum ile beraber yaratılmış olan siteleri ve application pool olarak da sharepoint ile alakalı olanı silin.

  -  İnternette bu sorunlarla karşılaşan onlarca insan var, bu da mutlaka çözüm bulacaksınız demektir. Aramaya devam edin.

Ayrıca 28805 yada 29105 hatası alıyorsanız muhtemelen aşağıdakilerden biri size yardımcı olacaktır.

  - Reporting Services Configuration Tool'da Database Tab içinde Service ya da Network Credentials kullanmayın, Windows Credentials kullanın. Burada, daha önce yarattığınız tfsreport kullanıcısını kullanın (domain\kullanıcı).

  - Yukarıda belirttiğim şey yetmediyse, SQL Server Management Studio'u açın ve ReportServer dblerini drop edin ve dosyalarını silin (dosyalar eğer durursa yine hata alırsınız, çok önemli).

Bu arada, SP1 yalnızca Team Foundation Server'ı kapsar, Build ya da Proxy'yi kapsamaz. Onların kurulumlarında sorun yaşıyorsanız size Allah yardımcı olsun.

Posted in: MSSQL | Visual Studio

Tags: , , , , ,

MS SQL 2005 veya MS SQL 2008'de yeni eklediğim satırın id'sini nasıl alırım, bu konuda hangi komut hangi durumda kullanılmalı?

October 25, 2008 at 7:44 AMoozturk

Merhaba,

Uzun zamandır yazı yazmaya fırsatım olmuyordu, hazır zamanım varken birşeyler karalayayım dedim. Bugün maillarıma bakarken bir arkadaşım sormuş bu sorunu, ben de hazır cevap verecekken buraya yazayım dedim.

Önce kullanılabilecek komutlara ismen bakalım, sonra ne zaman ve nerelerde kullanılabileceklerine bakarız;

- @@Identity

- Ident_Current('tabloadı')

- Scope_Identity()

- Sequence

 

@@Identity

Bu komut o esnada kullanılan veritabanına herhangi bir kullanıcı tarafından, herhangi bir yolla (hatta trigger kullanıyorsanız buna triggerlar da dahil olmak üzere) en son eklenmiş olan Id'yi getirir. Kullanımında çok dikkatli olmak ve ne yaptığını çok iyi biliyor olmak gerekir. Bazı bulk copy durumlarında bir sefere mahsus olarak null'da dönebilir bu değer, bununla alakalı yazıyı da www.microsoft.com adresinde bulabilirsiniz.

 

Ident_Current('tabloadı')

@@Identity'den farklı olarak bu sefer mevcut tablo için yine herhangi bir kullanıcı, session, yol ile yaratılmış en son kaydın Id'si alınabilir.

 

Scope_Identity()

Bu komut ile mevcut bağlantı ile mevcut scope da mevcut kullanıcının herhangi bir tabloya, herhangi bir yolla eklediği en son kaydın Id'si alınabilir.

Misal vermek gerekirse:

- Bir stored procedure hazırlamış olalım ve 3 farklı tabloya 3 farklı kayıt yaratmış olalım. Bu kayıtlardan en son hangsini yarattıysak onun Id'sini Select sope_identity() ile alabiliriz. Sonra bu eklediğimiz satıra bağlı olarak ekleyeceğimiz ya da değiştireceğimiz satırları bu değerle güncelleyebilir, ekleyebiliriz.

 

Sequence

Bu komut zaten diğer SQL serverlarda mevcut idi, MS SQL'e 2005 versiyonunda eklendi. rakamsal değerlere sahip Id kolonu kullandığımızda, yeni bir satır ekleyeceğimiz zaman bu komutu çağırıp mevzu bahis tablo için bir önceki kayıttan sonraki değer'i alabiliriz. Bu sayede alacağımız değer bize ait olacağı için aynı anda başka bir komut ile aynı işlem denendiğinde aynı değer verilemeyecek ve çakışma önlenmiş olacaktır. Bu komutun geri dönüşü olmadığı için herhangi bir sebepten tabloya yazamamış ya da yazmamış olursak yine de o Id değeri alınmış ve artık kullanılamaz olmuş olur.

Bu komut ile alakalı daha fazla bilgi için yine www.microsoft.com adresine bakılabilir.

Misal vermek gerekirse:

- Bir programımız var ve birden fazla kullanıcısı var diyelim ve kullanıcılardan birden fazlası aynı anda aynı işlemi yaptığında satır eklemesi yapılacak olsun, satır eklenecek olan tablodaki son Id değeri de 2 olsun. Sequence kullandığımız için birine Id olarak 3 diğerine 4 verilecektir.

 

İyi çalışmalar dilerim.

Posted in: MSSQL

Tags: , , ,

SQL'de Datetime nesnesinden yalnızca date almak

July 24, 2008 at 1:58 PMoozturk

Veritabanı uygulamalarında genelde tarih aralığında sorgu yapılması gerekir. Toplanmış olan verilerin anlamlı halde raporlanması ya da başka amaçlarla kullanmak amacıyla; "bugün yapılan satışların toplamı" ya da "bugün içerisinde giriş yapan kullanıcıların sayısı" gibi bilgiler hazırlanması gerekebilir. SQL kullanıyorsanız ve kullanıcılarınızın bölgesel ayarları kontrolünüz altında değil ise nvarchar'a çevirip istenilen yeri almak da kullanışsız olur çünkü karşılaştırılacak bilgi (yani veritabanında kayıtlı olan bilgiler) hala datetime tipinde saklıdır. Yani elinizdeki bilginin datetime tipinde olması gerekebilir, bu durumlarda aşağıdaki komutu kullanmak daha akıllıca oluyor.

select cast(floor(cast(getdate() as float)) as datetime)

Bu komut ile datetime tipindeki nesneden yalnızca date alınabilir. getdate() yazan yere değişkeninizi ya da kullanmak istediğiniz değer her ne ise onu (datetime tipinde olması koşuluyla) yazarak aynı işlemi yapabilirsiniz.

aslında başka türlü yollarda var aşağıda bir örnek daha verelim,

select cast(cast(getdate() as int) as datetime)

Ama bu komutla günün ilk ve son zamanlarını kaçırma ihtimaliniz var. Önceki örnekte kullandığımız floor komutu sayesinde float cinsine çevirdiğimiz datetime değerimizde istenilen durumlarda yuvarlama yapılırken bu örnekte int cinsine çevirerek bu yuvarlamayı imkansız hale getirmiş oluyoruz çünkü.


Ben şahsen ilk verdiğim örneği kullanıyorum çünkü hem diğer örneklere göre çok daha hızlı çalışıyor (büyük sistemlerde sürekli çalışan sorgular ciddi yük oluşturuyorlar, bu sebeple bir sorgunun daha efektif olması cidden önem taşıyor) hem de bilgisayara verdiği yük çok daha az oluyor.

Eh, böyle işte...

Posted in: MSSQL

Tags: