I was asked by a partner how he could adjust his table structure. He needed to check if a char field is available and adjust its size to a minimum of 40 characters. So I came up with this script:
declare @tbname string;
declare @fieldname string;
declare @fieldsize integer;
declare @col cursor as select * from system.columns where name like @fieldname and parent like @tbname;
declare @sql string;
@tbname='mytable';
@fieldname='myfield';
@fieldsize=40;
open @col;
if fetch @col then
--column exists, check size
if @col.field_length<@fieldsize then
@sql='alter table ['+@tbname+'] alter column ['+@fieldname+'] '+
'['+@fieldname+'] CHAR('+cast(@fieldsize as sql_char)+')';
endif;
else
--column does not exist
@sql='alter table ['+@tbname+'] add column '+
'['+@fieldname+'] CHAR('+cast(@fieldsize as sql_char)+')';
endif;
close @col;
if @sql is not null then
execute immediate @sql;
endif;
If you want to be more flexible, initialize the variables with parameters (Delphi example):
//...
query.sql.Add('@tbname=:tbname;');
query.sql.Add('@fieldname=:fieldname;');
query.sql.Add('@fieldsize=:fieldsize;');
//...
If you want to use it in multiple tables or for multiple fields, simply put it into a User Defined Function (UDF):
Create Function AdjustCharField(tablename string, fieldname string, fieldsize integer)
returns logical
begin
declare @tbname string;
declare @fieldname string;
declare @fieldsize integer;
declare @col cursor as select * from system.columns where name like @fieldname and parent like @tbname;
declare @sql string;
@tbname=tablename;
@fieldname=fieldname;
@fieldsize=fieldsize;
open @col;
if fetch @col then
--column exists, check size
if @col.field_length<@fieldsize then
@sql='alter table ['+@tbname+'] alter column ['+@fieldname+'] '+
'['+@fieldname+'] CHAR('+cast(@fieldsize as sql_char)+')';
endif;
else
--column does not exist
@sql='alter table ['+@tbname+'] add column '+
'['+@fieldname+'] CHAR('+cast(@fieldsize as sql_char)+')';
endif;
close @col;
try
if @sql is not null then
execute immediate @sql;
endif;
return true;
catch all
return false;
endtry;
end;
Now you can use this function for example in a script:
if AdjustCharField('mytable','myfield',40) then
select 'success' from system.iota;
else
select 'failed' from system.iota;
endif;
Adjusting Table Structure using SQL