Question

J'ai une table qui a un champ ntext . MSDN indique que ntext est obsolète et qu'ils suggère 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 plutôt nvarchar (max), varchar (max) et varbinary (max).

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 à partir 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 autorisée).

La seule solution efficace consiste à ajouter une nouvelle colonne de type varbinary (max) , à convertir la valeur existante dans la nouvelle colonne, puis à supprimer l'ancienne colonne. Cela prend beaucoup trop de temps (sur mon jeu de données d'environ 15 Go, cela prend environ 30 minutes). C'est pourquoi j'étudie d'autres possibilités pour atteindre le même objectif (éventuellement in-situ = sans transfert de données ni conversion).

Était-ce utile?

La solution

Je suppose que vous avez opté pour varbinary (max) car votre colonne ntext contenait des données non textuelles? Dans ce cas, je pense que vous allez devoir ajouter une colonne varbinary (max) distincte à votre table, puis exécuter une opération de conversion pour copier du ntext vers la nouvelle colonne. Ensuite, supprimez l’ancienne colonne et renommez la nouvelle colonne avec son 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 sur la conversion.

Autres conseils

Il semble que cette conversion devra se produire à un moment donné. Si vous effectuez une recherche, vous constaterez que de nombreuses personnes passent du texte à varchar (max) et indiquent que la conversion prend plus de 20 minutes. Mes deux sous après avoir recherché quelques minutes, alors ne le prenez pas comme un évangile.

Si votre table ne prend que des insertions, vous pouvez convertir les données existantes dans une table de stockage, puis renommer les tables de manière à ce que la gestion soit ensuite produite. Déplacez ensuite les données nouvellement créées de l’ancienne table pendant votre temps libre.

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

L'ajout de la colonne supplémentaire est probablement la meilleure solution. Je préfère faire ce genre de chose par étapes pour réduire les risques

  1. Ajouter la colonne varbinary (max) à nullable
  2. Modifiez votre code d'insertion pour renseigner les deux colonnes
  3. A votre guise, par exemple du jour au lendemain, exécutez l'instruction UPDATE avec un CAST
  4. Supprimez tout le support du code pour l'ancienne colonne, assurez-vous que la nouvelle colonne est lue
  5. Supprimez l'ancienne colonne et remplacez-la par la nouvelle si nécessaire
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top