在SQL Server中将列类型从TinyInt转换为Int

Saq*_*Ali 2 sql-server stored-procedures sql-server-2008 sql-server-2008-r2 sql-server-2012

我的数据库很多。数百列为类型TinyInt。我需要将它们全部转换为Int。是否可以使用存储过程来做到这一点?

mar*_*c_s 5

对此没有简单的解决方案。

最简单的方法是仅运行一个T-SQL脚本,该脚本将生成T-SQL ALTER TABLE .... ALTER COLUMN ...脚本作为输出(在每个数据库级别上),然后可以将其复制并粘贴到SQL Server Management Studio中。

就像是:

SELECT
    ColName = c.Name,
    SchemaName = s.Name,
    TableName = t.Name,
    AlterCommand = 'ALTER TABLE ' + QUOTENAME(s.Name) + '.' + QUOTENAME(t.Name) + 
                   ' ALTER COLUMN ' + QUOTENAME(c.name) + ' INT' + 
                        CASE WHEN c.is_nullable = 1 THEN ' NULL;' ELSE ' NOT NULL;' END
FROM
    sys.columns c
INNER JOIN
    sys.types ty ON ty.system_type_id = c.system_type_id
INNER JOIN 
    sys.tables t ON t.object_id = c.object_id
INNER JOIN 
    sys.schemas s ON s.schema_id = t.schema_id
WHERE
    ty.name = 'tinyint'
Run Code Online (Sandbox Code Playgroud)

另一种选择是将这段代码包装到一个过程中,该过程将一条ALTER TABLE ... ALTER COLUMN ...SQL语句创建为动态SQL语句,然后执行每个语句,并遍历所有TINYINT列。但同样:这将在每个数据库级别上。

另外,如果您可以从头开始创建这些数据库,则还可以将CREATE TABLE所有表的脚本编写成文本文件,在文本编辑器中替换TINYINTINT,然后在新的数据库/服务器上再次运行这些创建脚本。