Was ist der einfachste Weg, mit T-SQL/MS-SQL eine Zeichenfolge an vorhandene Tabellenzellen anzuhängen?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Tabelle mit einer Spalte „Dateiname“.Ich habe kürzlich eine Einfügung in diese Spalte durchgeführt, aber in meiner Eile vergessen, die Dateierweiterung an alle eingegebenen Dateinamen anzuhängen.Glücklicherweise handelt es sich bei allen Bildern um JPG-Bilder.

Wie kann ich die Spalte „Dateiname“ dieser eingefügten Felder einfach aktualisieren (vorausgesetzt, ich kann die letzten Zeilen basierend auf bekannten ID-Werten auswählen), um die Erweiterung „.jpg“ einzuschließen?

War es hilfreich?

Lösung

Die Lösung ist:

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

RTRIM ist erforderlich, da andernfalls die gesamte Spalte [Dateiname] für die Zeichenfolgenverkettung ausgewählt wird, d. h.Wenn es sich um eine varchar(20)-Spalte handelt und der Dateiname nur 10 Buchstaben lang ist, werden trotzdem diese 10 Buchstaben und dann 10 Leerzeichen ausgewählt.Dies führt wiederum zu einem Fehler, wenn Sie versuchen, 20 + 3 Zeichen in ein 20 Zeichen langes Feld einzufügen.

Andere Tipps

Die Antwort von MattMitchell ist richtig, wenn die Spalte ein CHAR(20) ist, aber nicht wahr, wenn es sich um einen VARCHAR(20) handelt und die Leerzeichen nicht explizit eingegeben wurden.

Wenn Sie es mit einem CHAR-Feld ohne die RTRIM-Funktion versuchen, erhalten Sie eine "String oder Binärdaten würden abgeschnitten werden" Fehler.

Schön einfach, denke ich.

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

Bearbeiten:Ooh +1 zu @MattMitchells Antwort auf den rtrim-Vorschlag.

Wenn die ursprünglichen Daten aus einer char-Spalte oder -Variablen stammten (bevor sie in diese Tabelle eingefügt wurden), wurden an die ursprünglichen Daten die Leerzeichen angehängt, bevor sie zu varchar wurden.

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

Lektion fürs Leben :Benutze niemals char.

Ich wollte David Bs „Life Lesson“ anpassen.Ich denke, es sollte lauten: „Niemals char für String-Werte variabler Länge verwenden“ -> Es gibt gültige Verwendungsmöglichkeiten für den Datentyp char, nur nicht so viele, wie manche Leute denken :)

Die Antwort auf das Rätsel der nachgestellten Leerzeichen finden Sie im ANSI_PADDING

Für weitere Informationen besuchen Sie: SET ANSI_PADDING (Transact-SQL)

Der Standardwert ist ANSI_PADDIN ON.Dies wirkt sich nur auf die Spalte aus, wenn sie erstellt wird, nicht jedoch auf vorhandene Spalten.

Überprüfen Sie Ihre Daten, bevor Sie die Aktualisierungsabfrage ausführen.Es könnte kompromittiert worden sein.

Führen Sie die folgende Abfrage aus, um gefährdete Zeilen zu finden:

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

In diesen Zeilen sind entweder einige Zeichen verloren gegangen oder es ist nicht genügend Platz zum Hinzufügen der Dateierweiterung vorhanden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top