SQL: 如何将所有表中的所有varchar 列更改为nvarchar?

SQL: How to alter all varchar column in all tables to nvarchar?

我需要在大约 40 table 秒(填充数据)内将所有 varchar 列转换为 nvarchar 列。它计划在仅用于此目的的专用 MS SQL 服务器中进行。结果应移动到 Azure SQL.

应该在哪里进行转换:在旧 SQL 上,还是在将其移动到 Azure SQL 服务器之后?

根据 Remus Rusanu 的回答 ,在此过程中创建了新的 nvarchar 列,并删除了旧的 varchar 列。 space 可以通过 DBCC CLEANTABLE 或使用 ALTER TABLE ... REBUILD 回收。删除的 varchar 列是否打包到备份 table 中,或者 backup/restore 是否也删除了删除的列?

能否使用通用 SQL 脚本以某种方式使流程自动化?还是每个人都要写脚本table?

背景:关于企业信息系统,我们是第3方。我们的产品从信息系统 SQL 数据库中读取数据,并以在 IS 中实施起来成本高昂的方式呈现数据。企业信息系统现已迁移至新版本,即将运行上AzureSQL。 IS 的数据库发生了重大变化,其中一项变化是放弃了旧的 8 位文本编码 (varchar),转而使用 Unicode (nvarchar)。我们的系统还用于收集手动输入的数据——使用与旧 IS 相同的编码。

迁移 将通过旧版本备份(SqlCmd 生成 xxx.bak 文件)完成,恢复到另一个好的旧版本 SQL 服务器。然后我们 运行 删除所有可以从 IS 重建的 tables、视图和存储过程的脚本。主要原因之一是 SQL 代码使用新备份工具 SqlPackage.exe 不接受的功能来生成 xxx.bacpac 文件。然后在 Azure SQL.

中恢复 bacpac 文件

Where should be the conversion done: on the old SQL, or after moving it on Azure SQL Server?

我会先在本地 SQLServer 上进行,运行 在 Azure 数据库上进行,可能会导致您 运行 遇到一些问题,例如达到 DTU 限制、磁盘 IO 节流..

Are the dropped varchar columns packed into the backup table, or does the backup/restore also remove the dropped columns?

space 不会释放回文件系统,备份也不会处理空闲的 spaces,所以你不会看到太多变化 there.You 可能想阅读更多关于dbcc cleantable though,before proceeding ..

Can the process be somehow automated using a universal SQL script? Or is it necessary to write the script for each individual table?

它可以自动化,也许你可以使用动态 sql 来查看列类型和进程 further.You 还必须查看这些列中的任何一个是否是索引的一部分,如果是的话你必须先放下它们

我建议事先对旧实例进行架构更改。即使您不用 DBCC CLEAANTABLEALTER...REBUILD 清理 space,生成的 bacpac 大小也会相同,因为与物理 backup/restore 不同,bacpac 文件是只是schema和data的压缩包格式。

考虑使用 SQL 服务器数据工具 (SSDT) 来促进架构更改。这将考虑对“通用”T-SQL 解决方案构成挑战的所有依赖项(约束、索引等)。 SSDT 通常会生成一个迁移脚本,该脚本使用临时表来进行此类架构更改,因此最终结果不会浪费在旧数据库中 space。但是,您需要在数据库中有足够的未使用 space 来并排包含 old/new 个对象。