Nous avons une ancienne table SQL utilisée par SQL Server 2000 depuis près de 10 ans.
Les numéros de badge de nos employés sont stockés sous la forme char(6)
de 000001
à 999999
.
J'écris actuellement une application Web et je dois stocker les numéros de badge des employés.
Dans ma nouvelle table, je pouvais prendre le raccourci et copier l'ancienne table, mais j'espère un meilleur transfert de données, une taille plus petite, etc., en stockant simplement les valeurs int
de 1
à 999999
.
En C #, je peux rapidement formater une valeur int
pour le numéro de badge à l'aide de
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
Comment pourrais-je modifier cette requête SQL simple pour formater également la valeur renvoyée?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Si EmployeeID
vaut 7135, cette requête doit renvoyer 007135
.
Modifiez le nombre 6 en fonction de votre longueur totale requise:
SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId
Si la colonne est une INT, vous pouvez utiliser RTRIM pour la convertir implicitement en VARCHAR.
SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)
Et le code pour supprimer ces 0 et récupérer le "vrai" numéro:
SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)
Utilisez simplement la fonction FORMAT (fonctionne sur SQL Server 2012 ou une version plus récente):
SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0
Référence: http://msdn.Microsoft.com/en-us/library/hh213505.aspx
Vous pouvez changer votre procédure de cette façon
SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText,
EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Cependant, cela suppose que votre EmployeeID
soit une valeur numérique et que ce code modifie le résultat en chaîne, je suggère d'ajouter à nouveau la valeur numérique d'origine.
EDIT Bien sûr, je n'ai pas lu attentivement la question ci-dessus. Il indique que le champ est un char(6)
alors que EmployeeID n'est pas une valeur numérique. Bien que cette réponse ait toujours une valeur en soi, ce n’est pas la bonne réponse à la question ci-dessus.
Je détestais avoir à convertir le int, et cela semble beaucoup plus simple. Peut-être même mieux fonctionner puisqu'il n'y a qu'une conversion de chaîne et une simple addition.
sélectionnez RIGHT (1000000 + EmployeeId, 6) ...
Assurez-vous simplement que le "1000000" contient au moins autant de zéros que la taille requise.
Je poste tout au même endroit, tout fonctionne pour moi de remplir avec 4 premiers zéro :)
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')
Une autre façon, juste pour être complet.
DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)
Ou, selon votre requête
SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID)
AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0
Aussi propre que possible et donnant la possibilité de remplacer par des variables:
Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0
À partir de la version 2012, vous pouvez utiliser
SELECT FORMAT(EmployeeID,'000000')
FROM dbo.RequestItems
WHERE ID=0
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems
WHERE ID=0
SELECT
cast(replace(str(EmployeeID,6),' ','0')as char(6))
FROM dbo.RequestItems
WHERE ID=0
La solution fonctionne pour les nombres signés/négatifs avec des zéros non significatifs, pour toutes les versions de SQL:
DECLARE
@n money = -3,
@length tinyint = 15,
@decimals tinyint = 0
SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')