Quel est le moyen le plus simple d'utiliser T-SQL/MS-SQL pour ajouter une chaîne aux cellules d'un tableau existant ?

StackOverflow https://stackoverflow.com/questions/17624

  •  09-06-2019
  •  | 
  •  

Question

J'ai une table avec une colonne « nom de fichier ».J'ai récemment effectué une insertion dans cette colonne mais, dans ma hâte, j'ai oublié d'ajouter l'extension de fichier à tous les noms de fichiers saisis.Heureusement, ce sont toutes des images '.jpg'.

Comment puis-je facilement mettre à jour la colonne « nom de fichier » de ces champs insérés (en supposant que je puisse sélectionner les lignes récentes en fonction des valeurs d'identification connues) pour inclure l'extension « .jpg » ?

Était-ce utile?

La solution

La solution est :

UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50

RTRIM est requis car sinon la colonne [nom de fichier] dans son intégralité sera sélectionnée pour la concaténation de chaînes, c'est-à-dires'il s'agit d'une colonne varchar (20) et que le nom de fichier ne contient que 10 lettres, il sélectionnera toujours ces 10 lettres, puis 10 espaces.Cela entraînera à son tour une erreur lorsque vous tenterez d'insérer 20 + 3 caractères dans un champ de 20 caractères.

Autres conseils

La réponse de MattMitchell est correcte si la colonne est un CHAR(20), mais n'est pas vraie s'il s'agissait d'un VARCHAR(20) et que les espaces n'ont pas été explicitement saisis.

Si vous l'essayez sur un champ CHAR sans la fonction RTRIM, vous obtiendrez un "Chaîne ou des données binaires seront tronquées" erreur.

Très facile, je pense.

update MyTable
set filename = filename + '.jpg'
where ...

Modifier:Ooh +1 à la réponse de @MattMitchell pour la suggestion rtrim.

Si les données d'origine provenaient d'une colonne ou d'une variable char (avant d'être insérées dans cette table), alors les données d'origine avaient les espaces ajoutés avant de devenir un varchar.

DECLARE @Name char(10), @Name2 varchar(10)
SELECT
  @Name = 'Bob',
  @Name2 = 'Bob'

SELECT
  CASE WHEN @Name2 = @Name THEN 1 ELSE 0 END as Equal,
  CASE WHEN @Name2 like @Name THEN 1 ELSE 0 END as Similiar

Leçon de vie :n'utilisez jamais de char.

Je voulais adapter "Life Lesson" de David B.Je pense que cela devrait être "ne jamais utiliser char pour les valeurs de chaîne de longueur variable" -> Il existe des utilisations valides pour le type de données char, mais pas autant que certaines personnes le pensent :)

La réponse au mystère des espaces de fin peut être trouvée dans ANSI_PADDING

Pour plus d'informations, visitez: FIXER ANSI_PADDING (Transact-SQL)

La valeur par défaut est ANSI_PADDIN ON.Cela affectera la colonne uniquement lors de sa création, mais pas les colonnes existantes.

Avant d'exécuter la requête de mise à jour, vérifiez vos données.Cela aurait pu être compromis.

Exécutez la requête suivante pour rechercher les lignes compromises :

SELECT *
FROM tablename 
WHERE LEN(RTRIM([filename])) > 46 
-- The column size varchar(50) minus 4 chars 
-- for the needed file extension '.jpg' is 46.

Ces lignes ont perdu certains caractères ou il n'y a pas assez d'espace pour ajouter l'extension de fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top