¿Cuál es la forma más sencilla de utilizar T-SQL/MS-SQL para agregar una cadena a las celdas de una tabla existente?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una tabla con una columna de 'nombre de archivo'.Recientemente realicé una inserción en esta columna, pero con las prisas olvidé agregar la extensión del archivo a todos los nombres de archivo ingresados.Afortunadamente, todas son imágenes '.jpg'.

¿Cómo puedo actualizar fácilmente la columna 'nombre de archivo' de estos campos insertados (suponiendo que pueda seleccionar las filas recientes según los valores de identificación conocidos) para incluir la extensión '.jpg'?

¿Fue útil?

Solución

La solucion es:

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

Se requiere RTRIM porque, de lo contrario, se seleccionará la columna [nombre de archivo] en su totalidad para la concatenación de cadenas, es decir,si es una columna varchar(20) y el nombre del archivo tiene solo 10 letras, aún así seleccionará esas 10 letras y luego 10 espacios.Esto, a su vez, generará un error al intentar colocar 20 + 3 caracteres en un campo de 20 caracteres de largo.

Otros consejos

La respuesta de MattMitchell es correcta si la columna es CHAR(20), pero no es cierta si es VARCHAR(20) y los espacios no se han ingresado explícitamente.

Si lo intenta en un campo CHAR sin la función RTRIM obtendrá un "Cadena o datos binarios podrían truncarse" error.

Bonito y fácil, creo.

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

Editar:Oh, +1 a la respuesta de @ MattMitchell por la sugerencia de rtrim.

Si los datos originales provienen de una columna o variable de caracteres (antes de insertarlos en esta tabla), entonces a los datos originales se les agregaron espacios antes de convertirse en un 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

Lección de vida :nunca uses carbón.

Quería ajustar la "Lección de vida" de David B.Creo que debería ser "nunca usar char para valores de cadena de longitud variable" -> Hay usos válidos para el tipo de datos char, pero no tantos como algunas personas piensan :)

La respuesta al misterio de los espacios finales se puede encontrar en ANSI_PADDING

Para más información visite: ESTABLECER ANSI_PADDING (Transact-SQL)

El valor predeterminado es ANSI_PADDIN ON.Esto afectará a la columna solo cuando se cree, pero no a las columnas existentes.

Antes de ejecutar la consulta de actualización, verifique sus datos.Podría haber estado comprometido.

Ejecute la siguiente consulta para buscar filas 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.

Estas filas han perdido algunos caracteres o no hay suficiente espacio para agregar la extensión del archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top