Tenemos una tabla SQL antigua que fue utilizada por SQL Server 2000 durante casi 10 años.
En él, nuestros números de tarjeta de empleado se almacenan char(6)
del 000001
al 999999
.
Ahora estoy escribiendo una aplicación web 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 int
valores de 1
a 999999
.
En C #, puedo formatear rápidamente un int
valor 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 regresar 007135
.
sql
sql-server
tsql
string-formatting
jp2code
fuente
fuente
0
s iniciales son importantes para este campo, ¿por qué cambiarlas a unaINT
?FORMAT
función como C # :-)int
valores ocupan mucho menos espacio quechar(6)
, y habrá múltiples de estas entradas por pieza que se fabrique. Eficiencia.DATALENGTH()
) dos bytes cada uno. Dado que la columna puede estar en un índice, podría estar ahorrando más de 2 MB. Y con otras columnas sumadas, esos 2 bytes podrían ser suficientes para reducir la longitud de una fila lo suficiente como para ahorrar una página de 4 KB por fila. ¿Se alojará en una plataforma móvil o es posible que centre su atención en un área improductiva?Respuestas:
Cambie el número 6 a la longitud total que necesite:
Si la columna es INT, puede usar RTRIM para convertirla implícitamente en VARCHAR
Y el código para eliminar estos 0 y recuperar el número 'real':
fuente
Simplemente use la función FORMAT (funciona en SQL Server 2012 o más reciente):
Referencia: http://msdn.microsoft.com/en-us/library/hh213505.aspx
fuente
Format
no conserva el tipo de datos, pero lo convierte implícitamente a nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Puede cambiar su procedimiento de esta manera
Sin embargo, esto supone que su
EmployeeID
es un valor numérico y este código cambia el resultado a una cadena, sugiero agregar nuevamente el valor numérico originalEDITAR Por supuesto que no he leído detenidamente la pregunta anterior. Dice que el campo es un
char(6)
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.fuente
'000000'
realmente necesario ...?'0'
también funciona bien. ¿Es seguro usar solo un 0 ..?07135
no007135
. La idea es concatenar a una cadena de0
6 caracteres compuesta por toda la cadena convertida EmployeedID, luego EMPEZANDO desde el borde derecho tomar 6 caracteres. Cualquiera que sea la longitud de la ID, el método anterior siempre devuelve una cadena con solo el número de caracteres cero necesarios para alcanzar la longitud de 6 caracteres'00000'
yaEmployeeID
que contendrá al menos un dígito. Pero laREPLICATE()
función parece más adecuada, como en las otras respuestasOdiaba 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 DERECHA (1000000 + EmployeeId, 6) ...
Solo asegúrese de que "1000000" tenga al menos tantos ceros como el tamaño necesario.
fuente
Estoy publicando todo en un solo lugar, todo funciona para rellenar con 4 cero a la izquierda :)
fuente
De otra forma, solo para completar.
O, según su consulta
fuente
A partir de la versión 2012, puede utilizar
fuente
Tan limpio como podría ser y dar margen de reemplazo con variables:
fuente
EmployeeID
columna se define comoint
, el operador + se tratará como una suma en lugar de una concatenación, por lo que los ceros se perderán. El usoconvert
evitará este problema.fuente
fuente
7135.0
cuando lo di7135
.La solución funciona para números con signo / negativo con ceros a la izquierda, para todas las versiones de Sql:
fuente
Lo más simple es siempre lo mejor:
fuente
En mi versión de SQL no puedo usar REPLICATE. Entonces hice esto:
fuente