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

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

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

Ответы [ 6 ]

26 голосов
/ 20 августа 2008

Решение:

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

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

5 голосов
/ 20 августа 2008

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

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

2 голосов
/ 20 августа 2008

Мне кажется, что это легко.

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

Редактировать: Ooh +1 к ответу @ MattMitchell за трогательное предложение.

1 голос
/ 17 сентября 2008

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

1 голос
/ 17 сентября 2008

Ответ на загадку замыкающих пробелов можно найти в 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.

Эти строки либо потеряли несколько символов, либо недостаточно места для добавления расширения файла.

1 голос
/ 17 сентября 2008

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

Life Lesson: никогда не используйте char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...