Necesito convertir todas las columnas varchar en aproximadamente 40 tablas (llenas de datos) a columnas nvarchar. Está previsto que suceda en un servidor MS SQL dedicado que se utilice únicamente para este fin. El resultado debe trasladarse a Azure SQL.

¿Dónde debería realizarse la conversión: en el SQL antiguo o después de moverlo a Azure SQL Server?

Según la respuesta de Remus Rusanu https://stackoverflow.com/a/8157951/1346705, nuevas columnas nvarchar se crean en el proceso y las antiguas columnas varchar se eliminan. El espacio puede ser reclamado por DBCC CLEANTABLE o usando ALTER TABLE ... REBUILD. ¿Las columnas varchar eliminadas están empaquetadas en la tabla de respaldo, o la copia de seguridad / restauración también elimina las columnas eliminadas?

¿Se puede automatizar el proceso de alguna manera utilizando un script SQL universal? ¿O es necesario escribir el guión para cada tabla individual?

Contexto: Somos el tercero con respecto al sistema de información empresarial . Nuestro producto lee de la base de datos SQL del sistema de información y presenta los datos de una manera que de otra manera sería costosa de implementar en el SI. El sistema de información empresarial ahora se migró a la nueva versión y se ejecutará en Azure SQL. La base de datos del IS se ha modificado considerablemente, y uno de los cambios fue abandonar la antigua codificación de texto de 8 bits (varchar) y utilizar Unicode en su lugar (nvarchar). Nuestro sistema también se usó para recopilar datos escritos manualmente, usando la misma codificación que usaba el antiguo IS.

La migración se debe realizar haciendo una versión anterior de la copia de seguridad (SqlCmd que produce xxx.bak archivos), restaurando en otro servidor SQL antiguo. Luego ejecutamos el script que elimina todas las tablas, vistas y procedimientos almacenados que se pueden reconstruir desde el IS. Una de las principales razones es que el código SQL usa características que no son aceptadas por la nueva herramienta de respaldo SqlPackage.exe para producir el archivo xxx.bacpac. Luego, el archivo bacpac se restaura en Azure SQL.

0
pepr 12 mar. 2021 a las 19:48

2 respuestas

La mejor respuesta

¿Dónde debería realizarse la conversión: en el SQL antiguo o después de moverlo a Azure SQL Server?

Lo haría en SQLServer local Primero, ejecutar esto en la base de datos de Azure, puede hacer que se encuentre con algunos problemas, como alcanzar los límites de DTU, aceleración de E / S del disco ...

¿Las columnas varchar eliminadas están empaquetadas en la tabla de respaldo, o la copia de seguridad / restauración también elimina las columnas eliminadas?

El espacio no se devolverá al sistema de archivos, además, la copia de seguridad no procesa los espacios libres, por lo que no verá muchos cambios allí. Sin embargo, es posible que desee leer más sobre dbcc cleantable, antes de continuar.

¿Se puede automatizar el proceso de alguna manera utilizando un script SQL universal? ¿O es necesario escribir el guión para cada tabla individual?

Puede ser automatizado, puede ser que pueda usar sql dinámico para ver el tipo de columna y seguir procesando.También tendrá que ver si alguna de esas columnas es parte de los índices, si es así, primero debe eliminarlas.

1
TheGameiswar 12 mar. 2021 a las 17:17

Sugiero hacer los cambios de esquema de antemano en las instancias antiguas. Incluso si no se molesta en limpiar el espacio con DBCC CLEAANTABLE o ALTER...REBUILD, el tamaño de bacpac resultante será el mismo porque, a diferencia de una copia de seguridad / restauración física, un archivo bacpac es solo un formato de paquete comprimido de esquema y datos.

Considere el uso de SQL Server Data Tools (SSDT) ​​para facilitar los cambios de esquema. Esto considerará todas las dependencias (restricciones, índices, etc.) que es un desafío con una solución T-SQL "universal". SSDT generalmente generará un script de migración que emplea tablas temporales para tales cambios de esquema, por lo que el resultado final no habrá desperdiciado espacio en su base de datos anterior. Sin embargo, necesitará suficiente espacio no utilizado en la base de datos para contener los objetos nuevos y antiguos uno al lado del otro.

1
Dan Guzman 12 mar. 2021 a las 17:15