OguzhanUyanik Mareşal
Mesaj Sayısı : 472 Kayıt tarihi : 31/08/09 Yaş : 32 Nerden : Konya İş/Hobiler : Bilgisyar-Yazılım Lakap : Nediz
| Konu: Veri tabanındaki belirli bir veri tipini otomatik değiştirme Salı Eyl. 08, 2009 2:24 pm | |
| Büyük veri tabanlarında veri tipini veya uzunluğunu nasıl değiştirirsiniz?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,'�gistiren_Kullanici_Kodu%','varchar',10,default,default,'varchar',20,default,defaultVeri 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:
[size=9]EXEC dbo.P_CHANGE_DATA_TYPE 'Tablo_Adı','�gistiren_Kullanici_Kodu%','varchar',10,default,default,'varvarchar',20,default,default
Örnek3:[/size] [size=9]
--[size=9]Degistiren_Kullanici_Kodu alanı int olsun onu float yapalım
EXEC dbo.P_CHANGE_DATA_TYPE 'Tablo_Adı','�gistiren_Kullanici_Kodu%','int',default,default,default,'float',default,default,default
[/size][/size] [size=9][size=9]Görüldüğü üzere uzunluk yollamadım çünkü bu veri tiplerinin uzunlukları sabit.
Örnek4:[/size][/size] [size=9][size=9]
--[size=9]Degistiren_Kullanici_Kodu alanı float olsun onu numeric(15,3) yapalım
EXEC dbo.P_CHANGE_DATA_TYPE default,'�gistiren_Kullanici_Kodu%','float',default,default,default,'numeric',default,15,3
[/size][/size][/size] [size=9][size=9][size=9]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:[/size][/size][/size] [size=9][size=9][size=9]
--[size=9]Degistiren_Kullanici_Kodu alanı numeric(15,3) olsun onu numeric(18,4) yapalım
EXEC dbo.P_CHANGE_DATA_TYPE default,'�gistiren_Kullanici_Kodu%','numeric',default,15,3,'numeric',default,18,4[/size][/size][/size][/size] | |
|