单个SQL查询一次更新表中所有列的数据类型

时间:2012-06-22 05:38:43

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

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

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

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

期待您的回复。

3 个答案:

答案 0 :(得分:5)

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

您可以做的是从系统目录视图迭代表的列,动态创建这样的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替换为您的实际表名 - 您应该好好去! 首先在实时数据上测试

答案 1 :(得分:4)

是不可能的。您需要逐个完成此操作。你可以做以下事情 -

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

答案 2 :(得分:1)

我想说,在一张桌子上放置625列并不是一个好的设计,但是你会按照你要求的那样去做。

您可以生成包含多个SQL语句的ALTER字符串,并使用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'