Qual é a maneira mais fácil de usar T-SQL/MS-SQL para anexar uma string às células da tabela existente?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho uma tabela com uma coluna 'nome do arquivo'.Recentemente, fiz uma inserção nesta coluna, mas na pressa esqueci de anexar a extensão do arquivo a todos os nomes de arquivo inseridos.Felizmente são todas imagens '.jpg'.

Como posso atualizar facilmente a coluna 'nome do arquivo' desses campos inseridos (supondo que posso selecionar as linhas recentes com base em valores de ID conhecidos) para incluir a extensão '.jpg'?

Foi útil?

Solução

A solução é:

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

RTRIM é necessário porque, caso contrário, a coluna [nome do arquivo] em sua totalidade será selecionada para a concatenação de strings, ou seja,se for uma coluna varchar(20) e o nome do arquivo tiver apenas 10 letras, ele ainda selecionará essas 10 letras e depois 10 espaços.Isso, por sua vez, resultará em um erro ao tentar encaixar 20 + 3 caracteres em um campo de 20 caracteres.

Outras dicas

A resposta de MattMitchell está correta se a coluna for CHAR(20), mas não é verdadeira se for VARCHAR(20) e os espaços não tiverem sido inseridos explicitamente.

Se você tentar em um campo CHAR sem a função RTRIM, obterá um "String ou dados binários seriam truncados" erro.

Bem fácil, eu acho.

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

Editar:Ooh +1 na resposta de @MattMitchell para a sugestão do rtrim.

Se os dados originais vieram de uma coluna ou variável char (antes de serem inseridos nesta tabela), então os dados originais tiveram os espaços anexados antes de se tornarem um 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

Lição de vida :nunca use char.

Eu queria ajustar a “Lição de Vida” de David B.Eu acho que deveria ser "nunca use char para valores de string de comprimento variável" -> Existem usos válidos para o tipo de dados char, mas não tantos quanto algumas pessoas pensam :)

A resposta para o mistério dos espaços finais pode ser encontrada no ANSI_PADDING

Para mais informações visite: DEFINIR ANSI_PADDING (Transact-SQL)

O padrão é ANSI_PADDIN ON.Isso afetará a coluna somente quando ela for criada, mas não nas colunas existentes.

Antes de executar a consulta de atualização, verifique seus dados.Poderia ter sido comprometido.

Execute a seguinte consulta para encontrar linhas comprometidas:

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

Essas linhas perderam alguns caracteres ou não há espaço suficiente para adicionar a extensão do arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top