【问题标题】:Convert column type from TinyInt to Int in SQL Server在 SQL Server 中将列类型从 TinyInt 转换为 Int
【发布时间】:2018-07-17 00:42:32
【问题描述】:

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

【问题讨论】:

  • 首先,为什么要标记 3 个不同版本的 SQL Server?其次,为什么要在存储过程中这样做?这是一次性活动。
  • 您的意思是要使用存储过程将数据库中的所有 tinyint 列更改为 int 吗?
  • @DanGuzman,没错。我想使用存储过程更改 tinyint 列以使它们为 int。

标签: sql-server sql-server-2008 stored-procedures sql-server-2012 sql-server-2008-r2


【解决方案1】:

没有简单的解决方案。

最简单的方法是只拥有一个您可以运行的 T-SQL 脚本,该脚本会生成 T-SQL ALTER TABLE .... ALTER COLUMN ... 脚本作为输出(在每个数据库级别上),然后您可以将其复制并粘贴到 SQL服务器管理工​​作室。

类似:

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'

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

或者,如果您可以从头开始创建这些数据库,您还可以将所有表的 CREATE TABLE 脚本编写到文本文件中,将文本中的 TINYINT 替换为 INT编辑器,然后针对新的数据库/服务器再次运行这些创建脚本。

【讨论】:

  • 我运行了一个查询表单AlterCommand 。但我看到错误ALTER TABLE ALTER COLUMN failed because column 'dbo' does not exist in table 'once'...**这里once是我的表名**
  • @marc_s 不应该是 + ' ALTER COLUMN ' + c.name - 引用列名而不是架构名
  • @IdontKnowEnglish:抱歉 - 我最初不理解您的评论 - 是的,表格需要 s.name - 但当然你是对的 - 对于列,我应该使用c.Name - 现已修复
  • QUOTENAME。哦,是的,人们将拥有名为 Worker's salaries 的表和名为 % Discount 的列(最好在您不期望的时候)。
  • @JeroenMostert:当然-感谢您的提示-包含在我的帖子中
猜你喜欢
  • 2021-04-03
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
相关资源
最近更新 更多