quitar - Formateo de números rellenando con ceros a la izquierda en SQL Server
rellenar con ceros a la izquierda sql server 2012 (12)
Tenemos una vieja tabla SQL que fue utilizada por SQL Server 2000 por cerca de 10 años.
En él, nuestros números de identificación de empleado se almacenan como caracteres char(6)
de 000001
a 999999
.
Estoy escribiendo una aplicación web ahora, y necesito almacenar los números de identificación de los empleados.
En mi nueva tabla, podría tomar el atajo y copiar la tabla anterior, pero espero una mejor transferencia de datos, un tamaño más pequeño, etc., simplemente almacenando los valores int
del 1
al 999999
.
En C #, puedo formatear rápidamente un valor int
para el número de placa usando
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
¿Cómo modificaría esta simple consulta SQL para formatear también el valor devuelto?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Si EmployeeID
es 7135, esta consulta debería devolver 007135
.
Cambia el número 6 a cualquiera que sea tu longitud total:
SELECT REPLICATE(''0'',6-LEN(EmployeeId)) + EmployeeId
Si la columna es INT, puede usar RTRIM para convertirla implícitamente a VARCHAR
SELECT REPLICATE(''0'',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)
Y el código para eliminar estos 0 y recuperar el número ''real'':
SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX(''%[^0]%'',EmployeeId)) + 1)
Desde la versión 2012 y en adelante puede usar
SELECT FORMAT(EmployeeID,''000000'')
FROM dbo.RequestItems
WHERE ID=0
En mi versión de SQL no puedo usar REPLICATE. Así que hice esto:
SELECT
CONCAT(REPEAT(''0'', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID
FROM
dbo.RequestItems`
Estoy publicando todo en un solo lugar, todo funciona para mí con 4 encabezado cero :)
declare @number int = 1;
print right(''0000'' + cast(@number as varchar(4)) , 4)
print right(''0000'' + convert(varchar(4), @number) , 4)
print right(replicate(''0'',4) + convert(varchar(4), @number) , 4)
print cast(replace(str(@number,4),'' '',''0'')as char(4))
print format(@number,''0000'')
La solución funciona para números con signo / negativo con ceros a la izquierda, para todas las versiones Sql:
DECLARE
@n money = -3,
@length tinyint = 15,
@decimals tinyint = 0
SELECT REPLICATE(''-'', CHARINDEX(''-'', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), ''-'', ''''), '' '', ''0'')
Odiaba tener que CONVERTIR el int, y esto parece mucho más simple. Incluso podría funcionar mejor ya que solo hay una conversión de cadena y una simple adición.
seleccione DERECHO (1000000 + Id del empleado, 6) ...
Solo asegúrese de que "1000000" tenga al menos tantos ceros como el tamaño necesario.
Otra forma, solo para completar.
DECLARE @empNumber INT = 7123
SELECT STUFF(''000000'', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)
O, según su consulta
SELECT STUFF(''000000'', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID)
AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0
Puede cambiar su procedimiento de esta manera
SELECT Right(''000000'' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText,
EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Sin embargo, esto supone que su EmployeeID
es un valor numérico y este código cambia el resultado a una cadena. Sugiero que agregue nuevamente el valor numérico original.
EDITAR Por supuesto, no he leído atentamente la pregunta anterior. Dice que el campo es un char(6)
por lo que EmployeeID no es un valor numérico. Si bien esta respuesta todavía tiene un valor per se, no es la respuesta correcta a la pregunta anterior.
Simplemente use la función FORMATO (funciona en SQL Server 2012 o posterior):
SELECT FORMAT(EmployeeID, ''000000'')
FROM dbo.RequestItems
WHERE ID=0
Referencia: http://msdn.microsoft.com/en-us/library/hh213505.aspx
Tan limpio como podría obtener y dar alcance de reemplazar con variables:
Select RIGHT(REPLICATE(''0'',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0
SELECT
cast(replace(str(EmployeeID,6),'' '',''0'')as char(6))
FROM dbo.RequestItems
WHERE ID=0
SELECT replicate(''0'', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems
WHERE ID=0