Veri tabanındaki belirli bir veri tipini otomatik değiştirme

Veritabanı programcılığı Veri tabanındaki belirli bir veri tipini otomatik değiştirme Programlama hakkında bilgi paylaş; En az 100 tabloluk bir veri tabanınız olsun, ve bu veri tabanında her tabloda Degistiren_Kullanici_Kodu adında ...
Cevapla
 
Seçenekler
  #1  
Arama 24-02-2008, 05:13
Banlı
Üyelik Tarihi: 18/09/07
Mesajlar: 1.551
 
     WS-Ticareti: (1)
Blog Yazıları: 1
Teşekkürleri: 0
20 Msg. 27 Tşkr.
Rep Gücü: 0 B737 rep gücü epey yüksek

Veri tabanındaki belirli bir veri tipini otomatik değiştirme

En az 100 tabloluk bir veri tabanınız olsun, ve bu veri tabanında her tabloda Degistiren_Kullanici_Kodu adında bir alanınız olsun. Ve o alanın veritipi varchar uzunluğu 10 olsun. Sizden şunu istediler:

- X veri tabanındaki Kullanicilar tablosundaki Kullanici_Kodu alaninin uzunlugunu 20 karakter yap ve tüm tablolardaki Degistiren_Kullanici_Kodu'nun uzunluğunu da buna göre 20 yap.

100 tablo her tabloyu açıp değişikliği yapıp kaydetmek 30 sn sürse (100*30)/60 = 50 dakika! Molaları ve ufak tefek hataları da sayarsak olur sana yarım mesai )

Bunun yerine aşağıdaki kodu kullanarak işi bir kaç saniyede bitirebilirsiniz:

CREATE PROCEDURE P_CHANGE_DATA_TYPE
--@lik
@TableName varchar(100)=null, --Tablo adı tekbir tablo değiştirillecekse
@FieldName varchar(100)=null, --Alan adı (LIKE yani % kullanılabilir)
@CurrDataType varchar(100), --Şuanki veri tipi
@CurrDataTypeLen int=null, --Eğer varchar,char,nvarchar v.b. ise şuanki uzunluğu yoksa NULL
@CurrDataTypePrec int=null, --NUMERIC veri tipi gibi uzunluğu sabit olmayan bir numerik veri tipi ise
--genişliği yoksa NULL
@CurrDataTypeScale int=null, --NUMERIC veri tipi gibi virgülden sonrası sabit olmayan veri tipi ise
--ondalık genişlik yoksa NULL
@NewDataType varchar(100), --Yeni veri tipi
@NeDataTypeLen int=null, --Eğer varchar,char,nvarchar v.b. ise yeni uzunluğu yoksa NULL
@NewDataTypePrec int=null, --NUMERIC veri tipi gibi uzunluğu sabit olmayan bir numerik veri tipi ise
--genişliği yoksa NULL
@NewDataTypeScale int=null --NUMERIC veri tipi gibi virgülden sonrası sabit olmayan veri tipi ise
--ondalık genişlik yoksa NULL
AS
/* Verilen tipteki tüm kolonların veri tiplerini değiştirir @lik 07/05/2003*/
/*Parametrelere göre alanların veri tiplerini değiştiri @lik 07/11/2007*/
DECLARE
@ColumnName VARCHAR(100),
@DataType VARCHAR(100)


BEGIN TRANSACTION
DECLARE Tables CURSOR FOR
SELECT o.name TableName, c.name ColumnName
FROM sysobjects o,
systypes t,
syscolumns c
WHERE c.id = o.id
AND o.type = 'U' --Tablolar
AND (o.name LIKE @TableName OR @TableName IS NULL)
AND (c.name LIKE @FieldName OR @FieldName IS NULL)
AND c.xusertype = t.xusertype
AND t.name = @CurrDataType
AND (c.length = @CurrDataTypeLen OR @CurrDataTypeLen IS NULL)
AND (c.xprec = @CurrDataTypePrec OR @CurrDataTypePrec IS NULL)
AND (c.xscale = @CurrDataTypeScale OR @CurrDataTypeScale IS NULL)
ORDER BY o.name
OPEN Tables
FETCH NEXT FROM Tables INTO @TableName, @ColumnName

WHILE @@FETCH_STATUS = 0
BEGIN
SET @DataType = "

IF NOT @NeDataTypeLen IS NULL
SET @DataType = @NewDataType + '(' + CONVERT(VARCHAR(50),@NeDataTypeLen) + ')'

IF NOT @NewDataTypePrec IS NULL OR @NewDataTypePrec > 0
BEGIN
SET @DataType = @DataType + '(' + CONVERT(VARCHAR(50),@NewDataTypePrec )
IF NOT @NewDataTypeScale IS NULL OR @NewDataTypeScale > 0
SET @DataType = @DataType + ',' + CONVERT(VARCHAR(50),@NewDataTypeScale)
SET @DataType = @DataType + ')'
END
-- PRINT 'ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @DataType
EXEC('ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @DataType)

FETCH NEXT FROM Tables INTO @TableName, @ColumnName
END

IF @@error != 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

CLOSE Tables
DEALLOCATE Tables
GO



Yukarıda verilen örnek için kod şu şekilde olmalı:
EXEC dbo.P_CHANGE_DATA_TYPE default,'%Degistiren_Kullanici_Kodu%','varchar',10 ,default,default,'varchar',20,default,default

Veri tabanında tüm tablolarda alan isimleri içinde Degistiren_Kullanici_Kodu olanların veri tipi uzunlukları 20 olacaktır.


Örnek2:
--------------------------------------------------------------------------------

--Tek bir tabloyu değiştirmek için:
EXEC dbo.P_CHANGE_DATA_TYPE 'Tablo_Adı','%Degistiren_Kullanici_Kodu%','varchar ',10,default,default,'varvarchar',20,default,defau lt


Örnek3:
--------------------------------------------------------------------------------

--Degistiren_Kullanici_Kodu alanı int olsun onu float yapalım
EXEC dbo.P_CHANGE_DATA_TYPE 'Tablo_Adı','%Degistiren_Kullanici_Kodu%','int',de fault,default,default,'float',default,default,defa ult

Görüldüğü üzere uzunluk yollamadım çünkü bu veri tiplerinin uzunlukları sabit.


Örnek4:


--------------------------------------------------------------------------------

--Degistiren_Kullanici_Kodu alanı float olsun onu numeric(15,3) yapalım
EXEC dbo.P_CHANGE_DATA_TYPE default,'%Degistiren_Kullanici_Kodu%','float',defa ult,default,default,'numeric',default,15,3

Görüldüğü üzere yeni veri tipine uzunluk yollamadım çünkü bu veri tipi nümerik ve tam sayı ile ondalık uzunluğu var.Yani uzunluk özelliğini sadece metinsel veri tiplerinde (text hariç) kullanıyoruz.


Örnek5:


--------------------------------------------------------------------------------

--Degistiren_Kullanici_Kodu alanı numeric(15,3) olsun onu numeric(18,4) yapalım
EXEC dbo.P_CHANGE_DATA_TYPE default,'%Degistiren_Kullanici_Kodu%','numeric',de fault,15,3,'numeric',default,18,4
Alıntı ile Cevapla
Cevapla
Arama Etiketleri: , , , , ,



Seçenekler


Benzer Konular
Konu Konu Açanlar Forum Cevaplar Güncel Mesajlar
Resme tıklayınca veri tabanındaki link alanından url nasıl açabilirim musdi42 ASP 2 02-08-2008 06:28
Veri tabanındaki belirli bir veri tipini otomatik değiştirme cunobag Veritabanı programcılığı 0 05-06-2008 03:25
Veri Yedekleme egitimbilgisi Asp kodları 0 30-11-2007 02:39
veri transferi kadınca Mysql 0 21-11-2007 10:46
PHP ve Veri TABANI Professionel Programlama Makaleleri 0 19-11-2007 07:58

Webmaster Sitesine Reklam Verin

Webmaster web tasarım online reviews ~ Kadınlar blogu ~ Apple iPhone, iPod Touch ( iTouch ) Forum ~ iPhone