Qual è il modo più semplice utilizzando T-SQL/MS-SQL per aggiungere una stringa alle celle della tabella esistente?

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

  •  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"?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top