2009-12-02 7 views
7

Je souhaite modifier une colonne dans SQL Server de type int, pour taper du texte, tout en conservant le nom de la colonne. Le tableau avec cette colonne a beaucoup de données, et je ne veux pas le perdre. SQL Server ne semble pas prendre en charge les conversions implicites ou explicites de l'int vers le texte, sinon ce serait assez simple. Alors, comment le feriez-vous en utilisant seulement SQL?Dans SQL Server, modifiez la colonne de type int pour entrer du texte

+0

'text', ou 'varchar'? –

+1

Il y a quelques réponses qui devraient vous aider à traverser votre problème, mais je voudrais juste ajouter que le type de données TEXT a beaucoup de "gotchas". Vous êtes presque certainement mieux d'utiliser VARCHAR (MAX) ou NVARCHAR (MAX) en supposant que votre SQL à 2005 ou plus tard. Même si ce n'est pas le cas, pensez à utiliser un très grand VARCHAR ou NVARCHAR à la place. –

+0

une raison particulière pour le texte au lieu de nvarchar (max)? – DForck42

Répondre

7

Étant donné que MS SQL Server (comme la plupart des bases de données) ne prend pas en charge la modification directe du type d'une colonne existante, vous devrez le faire par étapes. La façon dont je l'ai résolu des problèmes comme celui-ci dans le passé est (en supposant que votre table est nommée « foo » et votre colonne est nommé « bar »):

ALTER TABLE foo ADD COLUMN tempbar text; 
UPDATE foo SET tempbar = cast(cast(bar as varchar) as text); 
ALTER TABLE foo DROP COLUMN bar; 
ALTER TABLE foo ADD COLUMN bar text; 
UPDATE foo SET bar = tempbar; 
ALTER TABLE foo DROP COLUMN tempbar; 

(Une partie de la syntaxe SQL peut être désactivé, il a été un an depuis que je l'ai fait, à un autre travail, donc je n'ai pas accès à MS SQL Server ou la source. Vous aurez également à faire plus de choses si votre colonne a un index sur elle.)

Propose à Donnie pour la syntaxe de conversion.

[Modifier]

Tom H. a suggéré d'utiliser la procédure stockée sp_rename renommer tempbar comme bar (au lieu des étapes 4-6). C'est une solution spécifique à MS SQL Server qui peut fonctionner dans de nombreuses circonstances. La solution que j'ai décrite fonctionnera (avec des révisions syntaxiques) sur n'importe quelle base de données SQL, indépendamment de la version. Dans mon cas, je travaillais avec des clés primaires et étrangères, et pas seulement un seul champ, donc j'ai dû soigneusement commander toutes les opérations ET être portable sur plusieurs versions de MS SQL Server - étant explicite travaillé en ma faveur.

+1

Au lieu de supprimer, rajouter et remplir la barre, vous pouvez simplement le supprimer et renommer tempbar. –

+0

sp_rename ne fonctionnera pas dans Sql CE. – Edgar

5

Il vous suffit de doubler le type intermédiaire pour obtenir ce que vous voulez.

cast(cast(intField as varchar) as text)

+0

Je vais essayer. Merci! Pourquoi MS SQL ne gère-t-il pas cela lui-même? – manu08

+1

'text' est spécial, vous ne pouvez pas tester l'égalité, utiliser des index de texte, etc., donc seuls les champs connus pour contenir des données textuelles peuvent être' cast'. – Donnie

0

Voici un petit script d'exemple qui montre la méthode possible:

create table test (id int) 

create table test_tmp (id ntext) 


insert into test 
values (1) 
insert into test 
values (2) 

insert into test_tmp 
select convert(ntext,cast(id as nvarchar)) from test 

drop table test 

exec sp_rename 'test_tmp','test' 

Fondamentalement, nous créons une copie de la table, puis le remplir. Nous convertissons d'abord l'int en nvarchar puis nous prenons une valeur de texte. Enfin, nous laissons tomber l'ancienne table et renommons la table temporaire.

Questions connexes