When I imported a table in SQL it suggested real datatype, now I would like to change all columns to double type...
Is there any script to automatically do this in SQL Managment Studio
My table is 500 columns:
`After doing` EXECUTE sp_help traS
Col Type Comp len Prec Scale Nullable TrimTrailing Fixed Collation
-------------------------------------------------------------------------------
x1 real no 4 24 NULL yes (n/a) (n/a) NULL
x2 real no 4 24 NULL yes (n/a) (n/a) NULL
x3 real no 4 24 NULL yes (n/a) (n/a) NULL
x4 real no 4 24 NULL yes (n/a) (n/a) NULL
...
x500 real no 4 24 NULL yes (n/a) (n/a) NULL
The following code will place a list of columns into a temporary table called @cols
, loop through that table, generate an alter table alter column
statement, and execute it for each column.
If you need to exclude columns, you should include those in the NOT IN
predicate of the select from information_schema.columns.
declare @cols table (i int identity, colname varchar(100))
insert into @cols
select column_name
from information_schema.COLUMNS
where TABLE_NAME = 'yourtable'
and COLUMN_NAME not in ('exclude1', 'exclude2')
declare @i int, @maxi int
select @i = 1, @maxi = MAX(i) from @cols
declare @sql nvarchar(max)
while(@i <= @maxi)
begin
select @sql = 'alter table yourtable alter column ' + colname + ' decimal(18,4) NULL'
from @cols
where i = @i
exec sp_executesql @sql
select @i = @i + 1
end
Rough psuedocode would look like the following. It is untested however as I don't have a VM handy
-- Create a cursor that will iterate through
-- all the rows that meet the criteria DECLARE csr CURSOR FOR
-- This query attempts to define the set of columns
-- that are reals
SELECT
SC.name AS column_name
FROM
sys.tables ST
INNER JOIN
sys.columns SC
ON SC.object_id = ST.object_id
INNER JOIN
sys.types T
-- these column names are close but not right
ON T.type_id = SC.system_type_id
WHERE
-- make this your table name
ST.name = 'traS'
-- look at actual values in sys.types
AND T.name = 'real'
DECLARE
-- this holds the current column name
@column_name sysname
, @base_query varchar(max)
, @actual_query varchar(max)
-- template query for fixing what's buggered
SET @base_query = 'ALTER TABLE traS ALTER COLUMN [<X/>] decimal(18,2) NULL'
FETCH NEXT FROM csr
INTO @column_name
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
BEGIN TRY
SET @actual_query = REPLACE(@base_query, '<X/>', @column_name)
EXECUTE (@actual_query)
END TRY
BEGIN CATCH
PRINT 'Failed executing statement '
PRINT @actual_query
END CATCH
END
FETCH NEXT FROM csr
INTO @colum_name
END
CLOSE csr
DEALLOCATE csr
Orange bar overhead says I'm too slow but I'll submit anyways as I spent far too much time typing ;)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With