Tengo una cadena de hasta 3 caracteres cuando se creó por primera vez en SQL Server 2008 R2.
Me gustaría rellenarlo con ceros a la izquierda, por lo que si su valor original era '1', el nuevo valor sería '001'. O si su valor original era '23', el nuevo valor es '023'. O si su valor original es '124', entonces el nuevo valor es el mismo que el valor original.
Estoy usando SQL Server 2008 R2. ¿Cómo haría esto usando T-SQL?
sql-server
tsql
Sunil
fuente
fuente
Respuestas:
Si el campo ya es una cadena, esto funcionará
Si desea que los valores nulos se muestren como '000'
Puede ser un número entero, entonces usted querría
fuente
Aunque la pregunta era para SQL Server 2008 R2, en caso de que alguien esté leyendo esto con la versión 2012 y superior, desde entonces se hizo mucho más fácil con el uso de FORMAT .
Puede pasar una cadena de formato numérico estándar o una cadena de formato numérico personalizado como argumento de formato (gracias a Vadim Ovchinnikov por esta pista).
Para esta pregunta, por ejemplo, un código como
salidas
fuente
El método seguro:
Esto tiene la ventaja de devolver la cadena
'***'
para n <0 or n> 999, que es un indicador agradable y obvio de entrada fuera de los límites. Los otros métodos enumerados aquí fallarán en silencio al truncar la entrada a una subcadena de 3 caracteres.fuente
SELECT REPLACE(STR('1',3),' ','0')
Saltos:SELECT REPLACE(STR('1A',3),' ','0')
. Esto me quemó hoy cuando un usuario ingresó una letra en la cadena de entrada y no pude probar ese caso.Aquí hay una técnica más general para el relleno izquierdo a cualquier ancho deseado:
Sin embargo, si se trata de valores negativos y rellena con ceros a la izquierda, ni esta ni ninguna otra técnica sugerida funcionarán. Obtendrás algo parecido a esto:
[Probablemente no lo que querías]
Entonces ... tendrás que saltar algunos aros adicionales. Aquí hay un enfoque que formateará correctamente los números negativos:
Se debe tener en cuenta que las
convert()
llamadas deben especificar una[n]varchar
de longitud suficiente para contener el resultado convertido con truncamiento.fuente
Aquí hay una variante de la respuesta de Hogan que uso en SQL Server Express 2012:
En lugar de preocuparme si el campo es una cadena o no, lo hago
CONCAT
, ya que de todos modos generará una cadena. Además, si el campo puede ser unNULL
,ISNULL
puede ser necesario usar para evitar que la función obtengaNULL
resultados.fuente
Siempre he encontrado que el siguiente método es muy útil.
fuente
Use esta función que se adapta a cada situación.
Salida de muestra
fuente
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 12 - LEN(@NumStr)) + @NumStr;
que devuelve el primer ejemplo de Salar anterior. Gracias SalarDECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;
que regresa0000002016
en el primer ejemplo anterior.Para aquellos que desean actualizar sus datos existentes aquí está la consulta:
fuente
Para enteros, puede usar la conversión implícita de int a varchar:
fuente
Sé que es un boleto viejo, solo pensé en compartirlo.
Encontré este código buscando una solución. No estoy seguro si funciona en todas las versiones de MSSQL Tengo MSSQL 2016.
devuelve "0023" El 4 en la función STR es la longitud total, incluido el valor. Los ejemplos 4, 23 y 123 tendrán 4 en STR y se agregará la cantidad correcta de ceros. Puedes aumentarlo o disminuirlo. No es necesario obtener la longitud en el 23.
Editar: veo que es lo mismo que @Anon post.
fuente
Prueba esto con una longitud fija.
fuente
Tuve un problema similar con la columna entera como entrada cuando necesitaba una salida varchar (o cadena) de tamaño fijo. Por ejemplo, 1 a '01', 12 a '12'. Este código funciona:
Si la entrada también es una columna de varchar, puede evitar la parte de fundición.
fuente
Para un enfoque más dinámico intente esto.
fuente
Escribí esto porque tenía requisitos para una longitud específica (9). Rellena la izquierda con @pattern SOLO cuando la entrada necesita relleno. Siempre debe devolver la longitud definida en @pattern.
Devuelve 1234input
fuente
Simple es que
Me gusta:
fuente
Vine aquí específicamente para averiguar cómo podría convertir mi timezoneoffset en una cadena de zona horaria para convertir fechas a DATETIMEOFFSET en SQL Server 2008. Bruto, pero necesario.
Por lo tanto, necesito 1 método que haga frente a los números negativos y positivos, formateándolos a dos caracteres con un cero a la izquierda si es necesario. La respuesta de Anons me acercó, pero los valores negativos de zona horaria saldrían como
0-5
lugar de los requeridos-05
Entonces, con un pequeño ajuste en su respuesta, esto funciona para todas las conversiones de hora de zona horaria
fuente
Creé esta función que atiende a bigint y un cero inicial u otro carácter único (máximo 20 caracteres devueltos) y permite una longitud de resultados menor que la longitud del número de entrada:
fuente