2

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

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

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

期待您的回复。

4

3 回答 3

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- 你应该很高兴!首先在您的实时数据副本上进行测试

于 2012-06-22T06:10:37.250 回答
4

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

  1. 您可以使用所需的列和类型创建临时表。
  2. 将原始表中的数据复制到临时表中。
  3. 删除原表
  4. 将您的临时表重命名为您的原始名称
于 2012-06-22T05:45:56.930 回答
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'
于 2012-06-22T06:22:21.130 回答