Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
SQL Server : Tablolar için parametrik sıralı alan listesi
#1
Merhaba,

İleride kullanılmak üzere elinizin altında bulunmasında fayda olduğunu düşündüğüm bir tablo değerli fonksiyon örneğini paylaşmak istiyorum; Bu fonksiyon temelde adını verdiğiniz tablonun sütun yapısını veri tablosu olarak vermeye yarıyor; 

Bunu bir view olarak yapmak da mümkündü fakat parametrik olması ve sıralama yapılabilmesi gibi avantajları nedeniyle (Multi-Statement Table-Value) şeklinde kodlamak cazip geldi diyelim...

[Ars=sql]SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
--  =============================================
--  Author       : <Uğur  PARLAYAN>
--  Create  date : <2017-06-30-2158>
--  Description  : <Tabloların sütun listesini ve bir kaç yararlı bilgiyi içerir>
--  =============================================
ALTER  FUNCTION  dbo.fnt_sys_Kolonlar( @TabloAdi VARCHAR(50) )
RETURNS  @SONUC TABLE
(  ID        INT
,  Kolon     VARCHAR(50)
,  VeriTipi  VARCHAR(50)
,  CharSet   VARCHAR(50)
,  Bayt      INT
,  Bos       BIT
,  Primal    BIT
)  AS BEGIN
    INSERT INTO @SONUC (ID, Kolon, Primal, VeriTipi, Bos, Bayt, CharSet)
    SELECT    
             C.ORDINAL_POSITION                          as  ID
          ,  C.COLUMN_NAME                               as  Kolon
          ,  iif(T.CONSTRAINT_TYPE='PRIMARY KEY',1,0)    as  Primal
          ,  C.DATA_TYPE                                 as  VeriTipi
          ,  iif(C.IS_NULLABLE='YES',  1,  0)            as  Bos
          ,  COALESCE(C.CHARACTER_MAXIMUM_LENGTH,  C.NUMERIC_PRECISION)  as  Bayt
          ,  C.CHARACTER_SET_NAME                        as  CharSet
    FROM     INFORMATION_SCHEMA.COLUMNS                 as  C  LEFT  OUTER
    JOIN     INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE as  U  ON  U.TABLE_NAME = C.TABLE_NAME  AND  U.COLUMN_NAME = C.COLUMN_NAME  LEFT  OUTER
    JOIN     INFORMATION_SCHEMA.TABLE_CONSTRAINTS       as  T  ON  T.TABLE_NAME = C.TABLE_NAME  AND  T.CONSTRAINT_NAME = U.CONSTRAINT_NAME
    WHERE    C.TABLE_NAME = @TabloAdi
    ORDER BY C.ORDINAL_POSITION
    ;
    RETURN
END
GO[/ars]

Kullanımı ise oldukça basit;

[Ars=sql]SELECT * FROM dbo.fnt_sys_Kolonlar('Cariler');[/ars]
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#2
Tekrar Merhaba,


Eğer tüm tabloların tüm sütunlarını listelemek istiyorsak yukarıdaki fonksiyonun WHERE kısmında şu değişikliği yapmak yeterli olacaktır;

WHERE C.TABLE_NAME = IIF ( ISNULL(@TabloAdi, '') = '', C.TABLE_NAME, @TabloAdi )


Eğer SQL sunucunuz IIF komutunu desteklemiyorsa CASE'yi de kullanabilirsiniz;

WHERE C.TABLE_NAME = CASE WHEN ISNULL(@TabloAdi, '') = '' THEN C.TABLE_NAME ELSE @TabloAdi END 

Oluşan yeni duruma göre kullanımı da şöyle olacaktır;

SELECT * FROM dbo.fnt_sys_Kolonlar('');

veya 

SELECT * FROM dbo.fnt_sys_Kolonlar(NULL);


Kolay gelsin...
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#3
Merhaba,
Paylaşım için teşekkürler.
Anlatmış olduğunuz fonksiyonel SQL yapısı hangi veri tabanlarında destekleniyor.
Delphi Can'dır!
WWW
Cevapla
#4
(01-07-2017, Saat: 15:24)DelphiCan Adlı Kullanıcıdan Alıntı: Merhaba,
Paylaşım için teşekkürler.
Anlatmış olduğunuz fonksiyonel SQL yapısı hangi veri tabanlarında destekleniyor.

Ben paylaşımlarımı genelde SQL Server üzerinden örneklerim, çoğunluğun da bir şekilde SQL Server ile dirsek temasında olması gerektiğini düşünenlerdenim. 

Sorunuza gelecek olursak; Kısa cevap = çoğu destekliyor

Tablo Değerli fonksiyonlar gelişmiş bazı veritabanı sistemlerinde halihazırda destekleniyor, bunlar;

SQL Server ( https://technet.microsoft.com/en-us/libr....105).aspx )
IBM DB2 ( https://www.ibm.com/developerworks/ibmi/...index.html )
Postgresql ( https://blog.jooq.org/2014/07/07/postgre...functions/ )
Oracle ( https://oracle-base.com/articles/misc/pi...-functions )

MySQL malesef bu işlevselliği desteklemiyor ama stored procedure kullanarak "destekliyormuş" gibi düşünebilirsiniz, olaya biraz farklı bir açıdan yaklaşmanız gerekiyor. ( https://www.codeproject.com/Questions/10...ions-In-My )

Maalesef SQLite'de böyle bir işlevselliğe rastlayamadım fakat şöyle bir makale var ve bu işlevselliğin nasıl eklenebileceği ile ilgili bazı tekniklerden bahsedilmiş: http://charlesleifer.com/blog/sqlite-tab...th-python/ )

Son olarak MS-Access'de böyle bir işlevselliğe rastlayamadım ( belki vbscript ile benzer bir şeyler yapılabilir )
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#5
Access'te de bu tür özellikler mevcut olabilir.
Gizli sistem nesnelerini gösterirseniz orada tüm veritabanı yapılarının saklandığı tabloları görebilirsiniz.
İçinden istediğiniz tablodaki alanları satır halinde alabilirsiniz.
Cevapla
#6
(16-07-2018, Saat: 17:48)ssahinoglu Adlı Kullanıcıdan Alıntı: Access'te de bu tür özellikler mevcut olabilir.
Gizli sistem nesnelerini gösterirseniz orada tüm veritabanı yapılarının saklandığı tabloları görebilirsiniz.
İçinden istediğiniz tablodaki alanları satır halinde alabilirsiniz.

Access ile ilgili bir örnek verebilir misiniz
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#7
(16-07-2018, Saat: 18:07)uparlayan Adlı Kullanıcıdan Alıntı:
(16-07-2018, Saat: 17:48)ssahinoglu Adlı Kullanıcıdan Alıntı: Access'te de bu tür özellikler mevcut olabilir.
Gizli sistem nesnelerini gösterirseniz orada tüm veritabanı yapılarının saklandığı tabloları görebilirsiniz.
İçinden istediğiniz tablodaki alanları satır halinde alabilirsiniz.

Access ile ilgili bir örnek verebilir misiniz

MSysNameMap tablosunu ve diğerlerini inceleyebirsin kardeşim. Eskiden biraz daha kullanışlı veriler geliyordu ama 2016 sürümünde baktığımda binary şeklinde mevcut. Yine de isimleri içinden alabilirsin.

Veya sadece Access içinde kullanıyorsan fonksiyon yazabilirsin. Bazen SQL Server içinde iken de veritabanlarını bağlayıp bu tür özelliklerini alabiliyorsun. Ben bir ara SQL Server içine csv şeklinde txt dosyası bağlayıp benzer bir şey yapmıştım.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Bilgisayarda internete bağlı olan programların listesi SimaWB 7 6.887 25-12-2023, Saat: 14:12
Son Yorum: Maprins
  SQL Server : MySQL : Sayfalama, Pagination uparlayan 10 9.590 12-06-2021, Saat: 01:09
Son Yorum: uparlayan
  Yazılımcılar için hafta sonu okumaları cinarbil 1 1.816 03-07-2020, Saat: 14:15
Son Yorum: ahmet_sinav
  Enumerated Type'lar için Record Helper Kullanımı uparlayan 4 3.671 21-06-2020, Saat: 15:14
Son Yorum: uparlayan
  Mobil Platform için Kayan (Slide) Menü ve Açılır (Overflow=Popup) Menü Oluşturmak TescilsizUzman 13 14.913 24-04-2020, Saat: 10:06
Son Yorum: cihankoca



Konuyu Okuyanlar: 1 Ziyaretçi