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

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

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Решение:

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

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

Другие советы

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

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

Хороший, легкий вариант, я думаю.

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

Редактировать:Ох +1 к ответу @MattMitchell на предложение rtrim.

Если исходные данные поступили из символьного столбца или переменной (до вставки в эту таблицу), то к исходным данным были добавлены пробелы, прежде чем они стали 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.

Я хотел адаптировать «Урок жизни» Дэвида Б.Я думаю, что это должно быть «никогда не использовать char для строковых значений переменной длины» -> Для типа данных char существует допустимое использование, но не так много, как думают некоторые :)

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

Для получения дополнительной информации посетите: SET ANSI_PADDING (Transact-SQL)

По умолчанию ANSI_PADDIN включен.Это повлияет на столбец только при его создании, но не на существующие столбцы.

Прежде чем запускать запрос на обновление, проверьте свои данные.Это могло быть скомпрометировано.

Запустите следующий запрос, чтобы найти скомпрометированные строки:

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

В этих строках либо потеряны некоторые символы, либо недостаточно места для добавления расширения файла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top