Сведения о вопросе

Gentleman

09:48, 6th August, 2020

Теги

sql   sql-server   tsql    

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

Просмотров: 404   Ответов: 6

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

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



  Сведения об ответе

прога

03:42, 29th August, 2020

Решение заключается в следующем:

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

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


  Сведения об ответе

baggs

11:15, 2nd August, 2020

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

Если вы попробуете его на поле CHAR без функции RTRIM, то получите ошибку "String or binary data would be truncated" .


  Сведения об ответе

SKY

10:29, 7th August, 2020

По-моему, это очень просто.

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

Edit: Ooh +1 к @MattMitchell's ответ на предложение rtrim.


  Сведения об ответе

prince

11:23, 5th August, 2020

Ответ на загадку trailing пространств может быть найден в параметр 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.

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


  Сведения об ответе

darknet

06:01, 11th August, 2020

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


  Сведения об ответе

PROGA

13:50, 4th August, 2020

Я хотел подправить "Life Lesson" Дэвида Б. Я думаю, что это должно быть "never use char for variable length string values" -> есть допустимые применения для типа данных char, просто не так много, как думают некоторые люди :)


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться