Sorgunuza Özel Create Table Scripti Oluşturma
0

Veritabanı Yöneticisi veya geliştirici olarak büyük sorunlardan bir tanesi hazırladığımız sorguyu bir tabloya kayıt edilirken tablo yapısını oluşturulma sürecidir. Acaba bu kolona hangi veri türünde oluşturmalıyız şeklinde sorgunun incelemesini yaparız. Şimdi size bahsedeceğim dynamic management functionDMF ( sys.dm_exec_describe_first_result_set / sys.dm_exec_describe_first_result_set_for_object ) kullanımı ile bir hazırladığınız sorguya özel create table scriptini çıkartabiliyor olacaksınız. Yazıyı okumaya devam ederseniz neden SELECT INTO haricinde bir yapıdan bahsettiğimi de anlatacağım :)

Syntax

sys.dm_exec_describe_first_result_set(@tsql, @params, @include_browse_information)

@tsql : Sorgunuz yada batch kümesi

@params : Sp_executesql benzeri parametre verilebilimesini sağlar. Bu parametre için NULL varsayılan değerdir.

@include_browse_information : 1 olarak ayarlanırsa, her sorgu, sorguda FOR BROWSE seçeneğine sahipmiş gibi analiz edilir. Ek anahtar sütunlar ve kaynak tablo bilgileri döndürülür.

Sorgu kullanım sonrasında aşağıdaki meta verileri verir.

column_ordinal ( int ) : Sonuç kümesindeki sütunun sıra konumunu içerir. İlk sütunun konumu 1 olarak belirtilecektir.

Isim ( sysname ) : Bir isim belirlenebilirse sütunun adını içerir. Değilse, NULL içerecektir.

is_nullable ( bit ) : Sütun NULLs izin veriyorsa Değer 1. Sütun NULLs izin vermiyorsa değer 0. Sütun NULLs izin verdiği belirlenemiyorsa Değer 1.

system_type_name ( nvarchar(256)) Sütunun veri tipini döndürür. Veri türü CLR kullanıcı tanımlı bir türse, bu sütuna NULL döndürülür.

max_length : Sütunun maksimum uzunluğu (bayt cinsinden). -1 = Sütun veri türü varchar (max),nvarchar (max), varbinary (max) veya xml’dir.

Örnek Kullanım:

SELECT * FROM sys.dm_exec_describe_first_result_set(N’SELECT BusinessEntityID,Title,FirstName,LastName FROM HumanResources.vEmployee’, NULL, 0)


Resim-1

Gördüğünüz gibi “sys.dm_exec_describe_first_result_set” kullanımı ile sorgunun özelliklerini görmüş olduk ve buradaki bilgiler aslında bizim sorgu sonucuna uygun create table scripti oluşturmak için kullanmamız gereken özellikleri içeriyor. Create scripti oluşturacak bir function yazıp, create table işlemlerimizi de otomatikleştirmiş olabiliriz.

Sorgu :

CREATE FUNCTION fn_Create_Table_Structure (@InputSQL AS NVARCHAR(4000), @TableName AS NVARCHAR(128) = NULL)

RETURNS NVARCHAR(4000)

AS

BEGIN

DECLARE @SQL AS NVARCHAR(4000)

DECLARE @name NVARCHAR(128)

DECLARE @is_nullable BIT

DECLARE @system_type_name NVARCHAR(128)

DECLARE @collation_name NVARCHAR(128)

DECLARE @NewLine NVARCHAR(2) = CHAR(13) + CHAR(10) — CRLF

DECLARE CUR_Table CURSOR LOCAL FAST_FORWARD

FOR

SELECT name ,

is_nullable ,

system_type_name ,

collation_name

FROM sys.dm_exec_describe_first_result_set(@InputSQL, NULL, NULL)

WHERE is_hidden = 0

ORDER BY column_ordinal ASC

OPEN CUR_Table

FETCH NEXT FROM CUR_Table INTO @name, @is_nullable, @system_type_name,

@collation_name

SET @SQL = ‘CREATE TABLE [‘ + ISNULL(@TableName, ‘TableName’) + ‘] (‘

+ @NewLine

WHILE @@FETCH_STATUS = 0

BEGIN

SET @SQL += @NewLine + ‘[‘ + @name + ‘]’ + ‘ ‘ + @system_type_name

+ CASE WHEN @collation_name IS NOT NULL

THEN ‘ COLLATE ‘ + @collation_name + ‘ ‘

ELSE

END + CASE WHEN @is_nullable = 0 THEN ‘ NOT NULL ‘

ELSE

END + ‘,’

FETCH NEXT FROM CUR_Table INTO @name, @is_nullable, @system_type_name,

@collation_name

END

SET @SQL = LEFT(@SQL, LEN(@SQL) 1) + @NewLine + ‘)’

CLOSE CUR_Table

DEALLOCATE CUR_Table

RETURN @SQL

end

Yazdığımız fonksiyonu ise aşağıdaki gibi kullanabiliriz.

declare @script varchar(max)
DECLARE @InputSQL varchar(1000) = ‘SELECT BusinessEntityID,Title,FirstName,LastName FROM HumanResources.vEmployee’
select @script = dbo.fn_Create_Table_Structure(@InputSQL,‘PersonelOzet’)
print @script
exec (@script)

Resim-2

@script değişkenine aldığımız create sorgusunu da exec ile çalıştırdıktan sonra PersonelOzet isimli tablomuz oluşmuş ve kullanıma hazır durumdadır.

Farklı kaynaklardan gelen verileri tek bir ortak tabloya alma ihtiyacımız olabileceği için SELECT INTO kullanamıyoruz. SELECT INTO kullanımında sorgunun metadata cıktısını alabilmek adına SET FMTONLY kullanımı vardı fakat bu özellikte SQL Server 2012 ile sona ( https://docs.microsoft.com/en-us/sql/t-sql/statements/set-fmtonly-transact-sql ) erdi. Bu yüzden bu işlemi kullanmak adın artık bu DMF kullanmalıyız.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs: Auto Generate Create Table Script, Create Table Script, DMF, dynamic management function, SELECT INTO, SET FMTONLY, sys.dm_exec_describe_first_result_set, sys.dm_exec_describe_first_result_set_for_object

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Milenyumdan beri ilginç bir merak duygusu ile başlayan bilgisayar ve teknoloji dünyası merakı sayesinde eğitim yaşantımı doğup büyüdüğüm Düzce'de geçirdim. Sonrasında Düzce'nin kendimi geliştirmek adına yeterli imkanlara sahip olmadığından İstanbul'a gelip Bilge Adam Eğitim Kurumlarından Yazılım ve Veritabanı eğitimi aldım. Eğitimimi tamamlarken çeşitli Windows ve Web uygulamaları geliştirdim.Sırası ile Sentez Yazılım, Nebim Yazılım, Ciceksepeti, Doğan Holding, Kariyer.Net, TurkNet gibi firmalarında Yönetici / Müdür pozisyonlarında farklı ünvanlarda ( Yazılım Geliştirici / Raporlama ve Veritabanı Yöneticisi gibi) görev aldım. Şimdilerde ise DMC Bilgi Teknolojileri firmasının Kurucu Ortaklığını ve Veritabanı Danışmalığı Hizmeti vermekteyim.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir