Как проще всего использовать T-SQL / MS-SQL для добавления строки к существующим ячейкам таблицы?

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

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

Ответов (6)

Решение

Решение такое:

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

RTRIM требуется, потому что в противном случае для конкатенации строк будет выбран столбец [имя_файла] целиком, т.е. если это столбец varchar (20), а имя файла состоит всего из 10 букв, тогда он все равно выберет эти 10 букв, а затем 10 пробелов. Это, в свою очередь, приведет к ошибке, когда вы попытаетесь уместить 20 + 3 символа в поле длиной 20 символов.

Если исходные данные были получены из столбца или переменной типа 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.

Ответ MattMitchell верен, если столбец представляет собой CHAR (20), но неверен, если это был VARCHAR (20), а пробелы не были введены явно.

Если вы все же попробуете его в поле CHAR без функции RTRIM, вы получите ошибку «Строка или двоичные данные будут усечены .

Думаю, хороший простой.

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

Изменить: Ooh +1 to @ MattMitchell ответ на предложение rtrim.

Ответ на загадку конечных пробелов можно найти в ANSI_PADDING

Для получения дополнительной информации посетите: SET 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 может использоваться, но не так много, как думают некоторые :)