У меня есть таблица со столбцом «имя файла». Недавно я выполнил вставку в этот столбец, но в спешке забыл добавить расширение файла ко всем введенным именам файлов. К счастью, это все изображения формата .jpg.
Как я могу легко обновить столбец «имя файла» этих вставленных полей (при условии, что я могу выбрать последние строки на основе известных значений идентификатора), чтобы включить расширение «.jpg»?


Решение:
UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50
RTRIM требуется, потому что в противном случае для конкатенации строк будет выбран столбец [filename] целиком, т.е. если это столбец varchar (20), а имя файла состоит всего из 10 букв, тогда он все равно выберет эти 10 букв, а затем 10 пробелов. Это, в свою очередь, приведет к ошибке, когда вы попытаетесь уместить 20 + 3 символа в поле длиной 20 символов.
Я не уверен - поле, с которым я работал, было варchar (50), и оно включало интервал, который, как я согласен, кажется противоречащим идее varchar. Возможно, кто-то может просветить нас относительно того, почему varchar включает пробелы при выборе?
Если ваш столбец имел данные в виде поля char (50) и был изменен на varchar (50), дополнительные пробелы будут перенесены.
Думаю, хороший простой.
update MyTable
set filename = filename + '.jpg'
where ...
Обновлено: Ooh +1 to @ MattMitchell ответ на предложение rtrim.
Ответ MattMitchell верен, если столбец представляет собой CHAR (20), но неверен, если это был VARCHAR (20), а пробелы не были введены явно.
Если вы все же попробуете его в поле CHAR без функции RTRIM, вы получите ошибку "Строка или двоичные данные будут проигнорированы".
Я не уверен - поле, с которым я работал, было варchar (50), и оно включало интервал, который, как я согласен, кажется противоречащим идее varchar. Возможно, кто-то может просветить нас относительно того, почему varchar включает пробелы при выборе?
Если исходные данные были получены из столбца или переменной типа char (до того, как они были вставлены в эту таблицу), тогда к исходным данным были добавлены пробелы, прежде чем они стали 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
Урок жизни: никогда не используйте char.
А! Это был импорт Excel с помощью инструмента импорта SQL.
Ответ на загадку конечных пробелов можно найти в ANSI_PADDING
Для получения дополнительной информации посетите: НАБОР ANSI_PADDING (Transact-SQL)
По умолчанию ANSI_PADDIN ON. Это повлияет на столбец только при его создании, но не на существующие столбцы.
Прежде чем запускать запрос на обновление, проверьте свои данные. Это могло быть скомпрометировано.
Выполните следующий запрос, чтобы найти скомпрометированные строки:
SELECT *
FROM tablename
WHERE LEN(RTRIM([filename])) > 46
-- The column size varchar(50) minus 4 chars
-- for the needed file extension '.jpg' is 46.
В этих строках либо потеряны некоторые символы, либо недостаточно места для добавления расширения файла.
Я хотел отрегулировать "Урок жизни" Дэвида Б. Я думаю, это должно быть «никогда не использовать char для строковых значений переменной длины» -> Тип данных char может использоваться, но не так много, как думают некоторые :)
Включают ли значения варchar пробелы в выражениях или только поля символ фиксированной длины?