2010-04-23 6 views
38

Est-il possible de modifier un type de colonne dans une base de données SQL Server 2008 de varchar(255) à varchar(MAX) sans devoir supprimer la table et recréer?Varchar (255) à Varchar (MAX)

SQL Server Management Studio me renvoie une erreur chaque fois que j'essaie de le faire en utilisant cela - mais pour me sauver un mal de tête serait bon de savoir si je peux changer le type sans avoir à DROP et CREATE.

Merci

+2

Étrange, essayé dans SQL Server 2005, fonctionne très bien pour moi. – anonymous

+2

BTW, quelle a été l'erreur lancée? – anonymous

+1

'L'enregistrement des modifications n'est pas autorisé. Les modifications que vous avez apportées nécessitent la suppression et la recréation des tables suivantes. Vous avez soit apporté des modifications à une table qui ne peut pas être recréée, soit activé l'option Empêcher l'enregistrement des modifications nécessitant une table à recréer. L'option 'Empêcher les modifications d'enregistrement' n'est pas activée ... – Darbio

Répondre

66

Vous devriez être en mesure de le faire en utilisant TSQL.

Quelque chose comme

ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX) 
+0

cela a fonctionné. merci – Darbio

+0

pour moi aussi ça m'a aidé ... merci –

11

« Enregistrement des modifications est interdite. Les modifications que vous avez apportées nécessitent la suppression des tables suivantes et la recréation du . Vous avez effectué modifications apportées à une table qui ne peut pas être recréée ou activée l'option Empêcher les modifications nécessitant une table d'être recréées. ' Option « Empêcher l'enregistrement des modifications » n'est pas activée ..

C'est une nouvelle « fonctionnalité » dans SQL Server Management Studio 2008 qui, par défaut est activée. Chaque fois que vous effectuez une modification plus importante, SSMS ne peut recréer la table qu'en en créant une nouvelle, puis en déplaçant les données de l'ancienne, le tout en arrière-plan (ces modifications incluent notamment le réordonnancement de vos colonnes).

Cette option est désactivée par défaut, car si votre table contient des contraintes FK et autres, cette façon de refaire la table peut échouer. Mais vous pouvez définitivement activer cette fonctionnalité!

alt text http://i42.tinypic.com/19pegj.png

Il est sous Tools > Options et une fois que vous décocher cette option vous pouvez faire ce genre de changements dans la structure de table dans le concepteur de table.

+0

Merci marc_s. J'avais déjà ce non-coché et il m'empêchait toujours de faire les changements. Les déclarations d'altander ci-dessus ont fonctionné quand je les ai écrites elles-mêmes. Merci :) – Darbio

+0

@JD: hmm ... impair ... généralement c'est le problème - content que vous avez déjà une solution, cependant! –

1

Soyez conscient
avec quelque chose comme

ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX) 

https://dba.stackexchange.com/questions/15007/change-length-of-varchar-on-live-prod-table

Martin de Answare Smith:

Si vous augmentez à varchar(100 - 8000) (c.-à quoi que ce soit autre que varchar(max)) et vous faites cela via TSQL plutôt que l'interface graphique SSMS

ALTER TABLE YourTable ALTER COLUMN YourCol varchar(200) [NOT] NULL
et ne pas modifier la nullité de la colonne de NULL à NOT NULL (ce qui verrouillerait la table alors que toutes les lignes sont validées et potentiellement écrites vers ou depuis NOT NULL vers NULL dans certaines circonstances, il s'agit alors d'un changement rapide de métadonnées uniquement. Il faudra peut-être attendre un verrou SCH-M sur la table mais une fois qu'il acquiert que le changement sera à peu près instantané. Un inconvénient à prendre en compte est que pendant l'attente d'un verrou SCH-M, d'autres requêtes seront bloquées plutôt que de sauter la file d'attente avant cela, vous pouvez donc envisager d'ajouter un SET LOCK_TIMEOUT en premier. Assurez-vous également dans l'instruction ALTER TABLE que vous spécifiez explicitement NOT NULL s'il s'agit de l'état de la colonne d'origine, sinon la colonne sera modifiée pour autoriser NULL.

+0

N'est-ce pas identique à [cette réponse existante] (http://stackoverflow.com/a/2696003/1402846)? – Pang

+1

Pourquoi est-ce un problème pour ALTER à varchar (MAX)? – Chris