【问题标题】:Single SQL Query to update datatypes of all columns in a table at one shot单个 SQL 查询一次更新表中所有列的数据类型
【发布时间】:2012-06-22 05:38:43
【问题描述】:

我有一个 SQL Server 表,它有 625 列使用不同的数据类型创建,如 intvarchar(25)decimal(18, 2) 等...

现在有兴趣将所有列的数据类型更改为varchar(255)。不是对所有列一一执行下面的查询,是否有一个 SQL Server 查询可以一次性更改表中所有列的数据类型?

ALTER TABLE dbo.Employee 
ALTER COLUMN FirstName VARCHAR(255) NOT NULL

期待您的回复。

【问题讨论】:

  • all 数据类型更改为 VARCHAR(255) 听起来并不明智;毕竟,这些数据类型的存在是有原因的——你为什么要放弃这些数据类型?但是没有 - 没有“神奇的 T-SQL”可以将所有列更改为新的数据类型 - 您基本上必须逐列执行此操作 - 或者在该表的 sys.columns 条目上创建光标并执行 @每列987654329@语句
  • 你是对的 marc_s,但我有这样的要求。这可以在单个 sql 查询中完成吗?
  • 看看这个stackoverflow.com/questions/11047551/….. 可能对你有帮助..(类似于你的概念)

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

没有一个单一的“神奇”子弹可以做到这一点 - 这是一种相当不寻常的操作,因此本机不支持它。

您可以做的是从系统目录视图中迭代表的列,动态创建这样的 ALTER 语句,然后执行它 - 如下所示:

DECLARE AlterTableCursor CURSOR FAST_FORWARD 
FOR
    SELECT 
        AlterCmd = 'ALTER TABLE dbo.YourTableNameHere ALTER COLUMN ' + name + ' VARCHAR(255) NULL'
    FROM 
        sys.columns
    WHERE 
        object_id = OBJECT_ID('dbo.YourTableNameHere')

DECLARE @AlterTableCmd NVARCHAR(200)

OPEN AlterTableCursor

FETCH NEXT FROM AlterTableCursor INTO @AlterTableCmd

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC (@AlterTableCmd)

    FETCH NEXT FROM AlterTableCursor INTO @AlterTableCmd
END

CLOSE AlterTableCursor
DEALLOCATE AlterTableCursor

YourTableNameHere 替换为您的实际表名 - 您应该一切顺利!首先在实时数据的副本测试

【讨论】:

    【解决方案2】:

    不可能。您将需要一一进行。你可以做以下事情-

    1. 您可以使用所需的列和类型创建临时表。
    2. 将数据从原始表复制到临时表。
    3. 删除原表
    4. 将临时表重命名为原始名称

    【讨论】:

    • 为了做到这一点,在创建表时需要花费大量时间更改所有列的数据类型,我们可以按照上面的步骤操作,但我想在更短的时间内完成
    【解决方案3】:

    我会说在一个表中包含 625 列并不是一个好的设计,但是您可以按照要求执行的操作。

    您可以生成一个包含多个ALTER 语句的SQL 字符串并使用EXEC 执行它。但是,您必须小心数据转换。这就是为什么最好在游标中执行此操作的原因,因为您可以捕获无法更改的列的可能异常。这是一个简单的代码,它分两步完成:

    • 生成SQL字符串;
    • 使用EXEC执行它

    代码示例:

    SELECT * FROM sys.columns WHERE OBJECT_NAME(object_id) = 'Employee'
    
    DECLARE @SQL VARCHAR(MAX)
    SET @SQL = (
    SELECT '
    ALTER TABLE dbo.Employee ALTER COLUMN ' + c.name + ' VARCHAR(255) NULL;
    '
    FROM sys.columns c WHERE OBJECT_NAME(object_id) = 'Employee'
    FOR XML PATH(''), TYPE
    ).value('text()[1]', 'VARCHAR(MAX)')
    
    PRINT @SQL
    
    EXEC(@SQL)
    
    SELECT * FROM sys.columns WHERE OBJECT_NAME(object_id) = 'Employee'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多