Changer le type de colonne de ntext en varbinary (max)

J'ai une table qui a un champ ntext . MSDN indique que ntext est obsolète et propose d'autres types de données:

Les types de données ntext, text et image seront supprimés dans une future version de Microsoft SQL Server. Évitez d'utiliser ces types de données dans les nouveaux travaux de développement et prévoyez de modifier les applications qui les utilisent actuellement. Utilisez nvarchar (max), varchar (max) et varbinary (max) à la place.

Dans mon cas particulier, il a été décidé de passer à varbinary(max) . J'ai essayé de modifier la définition de la table, mais cela n'a pas fonctionné.

 ALTER TABLE MyTable ALTER COLUMN MyColumn VARBINARY(MAX); 

Quelles sont les possibilités de changer le type en varbinary(max) ? J'ai essayé de changer le type de ntext -> nvarchar(max) puis de nvarchar(max) -> varbinary(max) mais cela n'est pas possible (erreur: la conversion implicite du type de données nvarchar (max) en varbinary (max) n'est pas permis).

La seule solution de travail consiste à append une nouvelle colonne de type varbinary(max) , à convertir la valeur existante dans la nouvelle colonne, puis à supprimer l'ancienne colonne. Cela prend trop de time (sur mon set de données d'environ 15 Go cela prend environ 30 minutes). C'est pourquoi j'étudie d'autres possibilités pour réaliser la même chose (éventuellement sur place = sans déplacer datatables et la conversion).

    Je présume que vous êtes allé avec varbinary (max) parce que votre colonne ntext contenait des données non textuelles? Dans ce cas, je pense que vous allez devoir append une colonne varbinary (max) séparée à votre table, puis exécuter une opération de conversion pour copyr du ntext vers la nouvelle colonne. Ensuite, supprimez l'ancienne colonne et renommez la nouvelle colonne en ancien nom.

    "La conversion implicite du type de données nvarchar (max) en varbinary (max) n'est pas autorisée" signifie que vous allez devoir être explicite à propos de la conversion.

    Il semble que cette conversion va devoir arriver à un moment donné. Si vous effectuez une search, vous findez beaucoup de gens allant du text à varchar (max) et indiquant qu'il faut 20+ minutes pour convertir. Mes deux cents après avoir fait des searchs pendant quelques minutes, alors ne le prenez pas comme évangile.

    Si votre table ne prend que des insertions, vous pouvez convertir datatables existantes dans une table d'attente, puis renommer les tables pour que la mise en attente soit ensuite la production. Puis déplacez toutes datatables nouvellement créées de l'ancienne table pendant votre time d'arrêt.

    La gestion des mises à jour rend les choses plus complexes bien sûr.

    L'ajout de la colonne supplémentaire est probablement la meilleure façon de procéder. Je suis en faveur de faire ce genre de chose dans les étapes pour réduire les risques

    1. Ajoutez la colonne varbinary (max) en tant que nullable
    2. Modifiez votre code d'insertion pour remplir les deux colonnes
    3. À votre guise, dites du jour au lendemain, exécutez la déclaration UPDATE avec un CAST
    4. Supprimez tout le support de code pour l'ancienne colonne, assurez-vous que la nouvelle colonne est lue
    5. Déposez l'ancienne colonne et modifiez la nouvelle colonne pour qu'elle soit non nulle si nécessaire