2008-08-20 3 views
9

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 entrés. Heureusement, ils sont tous des images '.jpg'.Quelle est la manière la plus simple d'utiliser T-SQL/MS-SQL pour ajouter une chaîne à des cellules de tableau existantes?

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

Répondre

25

La solution est la suivante:

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

RTRIM est nécessaire car sinon la colonne [filename] dans son ensemble sera sélectionné pour la concaténation de chaîne à savoir si elle est une colonne varchar (20) et le nom de fichier est seulement 10 lettres longtemps alors il va encore sélectionner ces 10 lettres, puis 10 espaces. Cela entraînera à son tour une erreur lorsque vous essayez d'insérer 20 + 3 caractères dans un champ long de 20 caractères.

+0

Merci, très utile –

+1

Do *** var ** Les valeurs char * incluent des espaces dans les expressions ou juste des champs * char * de longueur fixe? –

+0

Je ne suis pas sûr - le domaine avec lequel je travaillais était un ** var ** char (50) et il incluait un espacement que je suis d'accord semble contre l'idée du varchar.Peut-être quelqu'un peut nous éclairer sur la raison pour laquelle le varchar inclus des espaces lorsqu'il est sélectionné? –

2

Belle facile je pense.

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

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

5

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

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

+0

Je ne suis pas sûr - le domaine avec lequel je travaillais était un ** var ** char (50) et il incluait un espacement que je suis d'accord semble contre l'idée du varchar. Peut-être quelqu'un peut nous éclairer sur la raison pour laquelle le varchar inclus des espaces lorsqu'il est sélectionné? –

1

Si les données d'origine proviennent d'une colonne ou d'une variable char (avant d'être insérée dans cette table), les espaces de données d'origine ont été 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 

Vie Leçon: n'utilisez jamais de carbonisation.

+0

AH! Ce fut une importation Excel en utilisant l'outil d'importation SQL –

1

La réponse au mystère des espaces de fuite se trouvent dans le ANSI_PADDING

Pour plus d'informations, visitez: SET 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 pour 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 trouver des lignes compromis:

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 soit perdu quelques caractères ou il n'y a pas assez d'espace pour ajouter l'extension de fichier.

+0

Merci pour la référence –

1

Je voulais ajuster la «leçon de vie» de David B. Je pense qu'il devrait être "jamais utiliser char pour les valeurs de chaîne de longueur variable" -> Il existe des utilisations valides pour le type de données char, juste pas autant que certaines personnes pensent :)

Questions connexes