0
votes

Déclaration SQL pour modifier la valeur d'une colonne avec cette même colonne de la clause WHERE

J'ai une base de données SQL Server et j'ai changé d'avis et au lieu d'une colonne de ma table définie comme un int , je veux le modifier en un varchar . J'ai donc changé le type à varchar (8) et enregistré mes modifications dans l'outil SQL Server Management Studio (V17.0).

On dirait que l'outil a converti les valeurs INT sur Varchars lorsque j'ai sauvegardé les modifications. Je veux changer la valeur de '1' à "externe", "2" à "SPTR" et "3" à "Autre". J'allais faire une valeur à la fois.

C'est la déclaration SQL simple que j'ai essayée: xxx

Le message d'erreur que je reçois de SSMS est

La conversion a échoué lors de la conversion de la valeur VARCHAR 'externe' en type de données INT "

C'est comme si la base de données pense que le type est int , mais ce n'est pas, c'est varchar (8) .


3 commentaires

Si cette requête a produit cette erreur, MyColumn n'est pas Varchar (8); C'est un int.


Comme @ Davidbrown-Microsoft, votre changement ne tenait pas. Voici le TSQL Alter Table Table MyTable Alter Colonne MyColumn Varchar (8) NULL . Puis exécutez votre mise à jour à nouveau.


Y a-t-il des déclencheurs sur la table?


3 Réponses :


3
votes

On dirait que vous n'avez vraiment pas changé le type de données. Ceci devrait em> résoudre le problème.

ALTER TABLE mytable ALTER COLUMN mycolumn varchar(8);
GO
UPDATE mytable
SET mycolumn = CASE mycolumn WHEN '1' THEN 'External'
                             WHEN '2' THEN 'SPTR'
                             ELSE 'OTHER'
               END;


4 commentaires

J'ai donc expliqué que la commande Alter Table dans l'outil de gestion Server SQL Server et qui a couru bien. J'ai ensuite couru la commande de mise à jour et elle revient avec la même erreur. Pas sûr de ce qui se passe. Je suis même sorti de l'outil SSM et j'ai redémarré mon système (sachez que cela ne voudrait probablement pas aider), mais je ne sais toujours pas pourquoi cela ne fonctionne pas.


Es-tu compris le Go @MDMENARD (pas qu'il devrait faire une différence)? I ne peut pas reproduire le problème.


Oui, j'ai aussi eu la déclaration de Go.


Ensuite, je me tiens à mon énoncé de ce que je ne peux pas reproduire le problème, @MDMenard .David Browne pense probablement que le bon chemin de là est un déclencheur ou quelque chose sur la table que vous n'avez pas parlé.



0
votes
ALTER TABLE mytable ALTER COLUMN mycolumn varchar(50);
SELECT DATALENGTH ('External')  returns 8As long as I know varchar does not use all 50 bytes, it only uses 8 in your case to store "External" field, why don't you try to change table size.

0 commentaires

0
votes

Si vous avez changé mycolumn à une chaîne, vous devez alors fonctionner: xxx

Si vous obtenez une erreur de conversion de type, je suppose que vous avez une gâchette sur la table qui cause le problème. Vous pourriez avoir peur de dire que le type a changé. Mais même si vous êtes correct, un déclencheur pourrait toujours générer ce problème.


0 commentaires