Konuyu Paylaş : facebook gplus twitter

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

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

Kullanımı ise oldukça basit;

SELECT * FROM dbo.fnt_sys_Kolonlar('Cariler');
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...
Cevapla
#3
Merhaba,
Paylaşım için teşekkürler.
Anlatmış olduğunuz fonksiyonel SQL yapısı hangi veri tabanlarında destekleniyor.
WWW
Cevapla
#4
(01-07-2017, Saat: 15:24)DelphiCan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,
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 ( Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol )
IBM DB2 ( Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol )
Postgresql ( Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol )
Oracle ( Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol )

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. ( Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol )

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ş: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol )

Son olarak MS-Access'de böyle bir işlevselliğe rastlayamadım ( belki vbscript ile benzer bir şeyler yapılabilir )
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  SQL Server : Tablo Değişkeni Kullanımı (Running Total, Yürüyen Bakiye Örneği) uparlayan 5 259 22-03-2018, Saat: 12:28
Son Yorum: hi_selamlar
  MS-SQL Server'da tekrar eden (çift, mükerrer) kayıtları tespit etme ve silme. csunguray 6 248 29-01-2018, Saat: 18:29
Son Yorum: adelphiforumz
  Datasnap + Rest Server -> Evrensel Veri Adaptörü - 001 - Sunucu Uygulaması mad85 7 494 17-11-2017, Saat: 22:56
Son Yorum: mad85
  SQL Server : Trigger hangi kipte çalışıyor uparlayan 9 871 13-09-2017, Saat: 14:43
Son Yorum: uparlayan
  SQL Server : GROUP_CONCAT ve LISTAGG Simülasyonu uparlayan 0 335 02-07-2017, Saat: 13:47
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi