我有一个SQL Server表,其中有625列使用不同的数据类型创建,如int
,varchar(25)
,decimal(18, 2)
等...
现在我有兴趣将所有列的数据类型更改为varchar(255)
。有没有一个SQL Server查询可以一次性更改表中所有列的数据类型,而不是逐个执行下面所有列的查询?
ALTER TABLE dbo.Employee
ALTER COLUMN FirstName VARCHAR(255) NOT NULL
期待您的回复。
答案 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)
是不可能的。您需要逐个完成此操作。你可以做以下事情 -
答案 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'