Qual è il modo più semplice utilizzando T-SQL/MS-SQL per aggiungere una stringa alle celle della tabella esistente?
-
09-06-2019 - |
Domanda
Ho una tabella con una colonna "nome file".Recentemente ho eseguito un inserimento in questa colonna ma nella fretta ho dimenticato di aggiungere l'estensione del file a tutti i nomi di file inseriti.Fortunatamente sono tutte immagini '.jpg'.
Come posso aggiornare facilmente la colonna "nome file" di questi campi inseriti (supponendo di poter selezionare le righe recenti in base a valori ID noti) per includere l'estensione ".jpg"?
Soluzione
La soluzione è:
UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50
RTRIM è necessario perché altrimenti la colonna [filename] nella sua interezza verrà selezionata per la concatenazione di stringhe, ad es.se è una colonna varchar(20) e il nome file è lungo solo 10 lettere, selezionerà comunque quelle 10 lettere e poi 10 spazi.Ciò risulterà a sua volta in un errore quando si tenta di inserire 20 + 3 caratteri in un campo lungo 20 caratteri.
Altri suggerimenti
La risposta di MattMitchell è corretta se la colonna è CHAR(20), ma non è vera se era VARCHAR(20) e gli spazi non erano stati immessi esplicitamente.
Se lo provi su un campo CHAR senza la funzione RTRIM otterrai a "I dati stringa o binari verrebbero troncati" errore.
Bello e facile, penso.
update MyTable
set filename = filename + '.jpg'
where ...
Modificare:Ooh +1 alla risposta di @MattMitchell per il suggerimento rtrim.
Se i dati originali provenivano da una colonna o variabile char (prima di essere inseriti in questa tabella), ai dati originali venivano aggiunti degli spazi prima di diventare 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
Lezione di vita :non usare mai char.
Volevo adattare "Life Lesson" di David B.Penso che dovrebbe essere "non usare mai char per valori di stringa di lunghezza variabile" -> Esistono usi validi per il tipo di dati char, ma non così tanti come alcuni pensano :)
La risposta al mistero degli spazi finali può essere trovata in ANSI_PADDING
Per maggiori informazioni visita: SET ANSI_PADDING (Transact-SQL)
Il valore predefinito è ANSI_PADDIN ON.Ciò influirà sulla colonna solo quando verrà creata, ma non sulle colonne esistenti.
Prima di eseguire la query di aggiornamento, verifica i tuoi dati.Potrebbe essere stato compromesso.
Esegui la query seguente per trovare le righe compromesse:
SELECT *
FROM tablename
WHERE LEN(RTRIM([filename])) > 46
-- The column size varchar(50) minus 4 chars
-- for the needed file extension '.jpg' is 46.
Queste righe hanno perso alcuni caratteri oppure non c'è spazio sufficiente per aggiungere l'estensione del file.