Mesela Sql management studio yada MYSQL workbench gibi bir program yazmak istesek veritabanındaki bütün şemaları, tabloları, sütunları, varsa foreign key 'leri, soted procedure 'ları, sütunları özelliklerini (primary key, varchar, auto incerement ...vs) kısaca bütün özellikleri almamız gerekecek. Böyle bir programı nasıl yazabiliriz? Mesela en basitinden veritabanındaki tabloların listesini ve bu tablolardaki sütunları nasıl kodlarla çekebiliriz?

soruldu: 16 Oca '13, 07:07

numankaraaslan's gravatar image

numankaraaslan
1.8k253749
cevap kabul oranı: 19%


(+1 yeni bişey daha öğrendim) Mesela SQL server 2008 de aşağıdaki kod veritabanları içerisindeki tabloların kolonlarını ozellikleri ile birlikte ceker.

SELECT
s.name as ColumnName
    ,sh.name+'.'+o.name AS ObjectName
    ,o.type_desc AS ObjectType
    ,CASE
         WHEN t.name IN ('char','varchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length) END+')'
         WHEN t.name IN ('nvarchar','nchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length/2) END+')'
        WHEN t.name IN ('numeric') THEN t.name+'('+CONVERT(varchar(10),s.precision)+','+CONVERT(varchar(10),s.scale)+')'
         ELSE t.name
     END AS DataType

    ,CASE
         WHEN s.is_nullable=1 THEN 'NULL'
        ELSE 'NOT NULL'
    END AS Nullable
    ,CASE
         WHEN ic.column_id IS NULL THEN ''
         ELSE ' identity('+ISNULL(CONVERT(varchar(10),ic.seed_value),'')+','+ISNULL(CONVERT(varchar(10),ic.increment_value),'')+')='+ISNULL(CONVERT(varchar(10),ic.last_value),'null')
     END
    +CASE
         WHEN sc.column_id IS NULL THEN ''
         ELSE ' computed('+ISNULL(sc.definition,'')+')'
     END
    +CASE
         WHEN cc.object_id IS NULL THEN ''
         ELSE ' check('+ISNULL(cc.definition,'')+')'
     END
        AS MiscInfo
FROM sys.columns                           s
    INNER JOIN sys.types                   t ON s.system_type_id=t.user_type_id and t.is_user_defined=0
    INNER JOIN sys.objects                 o ON s.object_id=o.object_id
    INNER JOIN sys.schemas                sh on o.schema_id=sh.schema_id
    LEFT OUTER JOIN sys.identity_columns  ic ON s.object_id=ic.object_id AND s.column_id=ic.column_id
    LEFT OUTER JOIN sys.computed_columns  sc ON s.object_id=sc.object_id AND s.column_id=sc.column_id
    LEFT OUTER JOIN sys.check_constraints cc ON s.object_id=cc.parent_object_id AND s.column_id=cc.parent_column_id
ORDER BY sh.name+'.'+o.name,s.column_id

Yukarıdaki kodun benim server daki örnek çıktısı:

sno                 dbo.Cities              USER_TABLE  int         NOT NULL    identity(1,1)=82
CityName            dbo.Cities              USER_TABLE  nvarchar(25)    NULL    
CityPlate           dbo.Cities              USER_TABLE  nvarchar(3) NULL    
CityPhoneCode       dbo.Cities              USER_TABLE  nchar(5)    NULL    
YahooZipCode        dbo.Cities              USER_TABLE  nvarchar(50)    NULL    
sno                 dbo.CompensationRelays  USER_TABLE  int NOT NULL    
VoltPhs1            dbo.CompensationRelays  USER_TABLE  float   NOT NULL    
....
....
....

Sadece kolon isimleri ile beraber

sp_MSforeachdb 'select 
''?'' AS DatabaseName, o.name AS TableName,c.name AS ColumnName
from sys.columns            c
    inner join sys.objects  o on c.object_id=o.object_id
--WHERE ''?'' NOT IN (''master'',''msdb'',''tempdb'',''model'')
order by o.name,c.column_id'

Views, Stored procedures , vs... gibi butun veritabanlarındaki butun ozellikleri almak mumkun. Tabi burada size ne gerekli ne gerekli degil ona gore kodları duzenleyip istediginiz bilgileri cekebilirsiniz. Sanırım bunlar biraz ipucu verir, bundan sonrasını istediginiz alanlara ozel olarak biraz arastırma yaparak kendiniz cozebilirsiniz. Sorunun ucu acık yuzlerce ornek verilebilir.

Diğer Örnekler

permanent link

cevaplandı: 16 Oca '13, 07:25

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288
cevap kabul oranı: 44%

değiştirildi: 16 Oca '13, 08:02

mysql de aradiginiz bilgiler information_schema da olabilir

permanent link

cevaplandı: 16 Oca '13, 08:01

tafali's gravatar image

tafali
4593412
cevap kabul oranı: 12%

evet mysql de information_schema ile bilgileri alınıyormuş. teşekkürler.

(16 Oca '13, 08:36) numankaraaslan numankaraaslan's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×144
×77

Soruldu: 16 Oca '13, 07:07

Görüntüleme: 891 kez

Son güncelleme: 16 Oca '13, 08:36

powered by BitNami OSQA