当我在SQL中导入表时,它建议使用真实的数据类型,现在我想将所有列更改为 double type ...
是否有任何脚本可以在SQL Managment Studio中自动执行此操作
我的表是500列:
`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
答案 0 :(得分:8)
以下代码将列的列放入名为@cols
的临时表中,循环遍历该表,生成alter table alter column
语句,并为每列执行。
如果您需要排除列,则应将这些列包含在来自information_schema.columns的NOT IN
谓词中。
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
答案 1 :(得分:1)
粗糙的伪代码如下所示。然而,它没有经过测试,因为我没有VM方便
-- 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
橘子棒开头说我太慢了但是我还是会提交,因为我花了太多时间打字;)