Nous avons une ancienne table SQL qui a été utilisée par SQL Server 2000 pendant près de 10 ans.
Dans celui-ci, les numéros de badge de nos employés sont stockés char(6)
du 000001
au 999999
.
J'écris actuellement une application Web et j'ai besoin de stocker les numéros de badge des employés.
Dans ma nouvelle table, je pourrais 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 int
valeurs de 1
à 999999
.
En C #, je peux rapidement mettre en forme une int
valeur pour le numéro de badge en utilisant
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
Comment modifier cette simple requête SQL pour formater également la valeur renvoyée?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Si EmployeeID
est 7135, cette requête doit renvoyer 007135
.
sql
sql-server
tsql
string-formatting
jp2code
la source
la source
0
sont importants dans ce domaine, pourquoi le changer en unINT
?FORMAT
fonction comme C # :-)int
valeurs occupent beaucoup moins d'espace quechar(6)
, et il y aura plusieurs de ces entrées par pièce fabriquée. Efficacité.DATALENGTH()
) deux octets chacun. Étant donné que la colonne peut être dans un index, vous pourriez économiser plus de 2 Mo. Et avec les autres colonnes ajoutées, ces 2 octets pourraient suffire à réduire suffisamment la longueur d'une ligne pour enregistrer une page de 4 Ko par ligne. Est-ce que cela va être hébergé sur une plate-forme mobile, ou pourriez-vous concentrer votre attention sur une zone improductive?Réponses:
Changez le nombre 6 en ce que votre longueur totale doit être:
Si la colonne est un INT, vous pouvez utiliser RTRIM pour la convertir implicitement en VARCHAR
Et le code pour supprimer ces 0 et récupérer le `` vrai '' nombre:
la source
Utilisez simplement la fonction FORMAT (fonctionne sur SQL Server 2012 ou plus récent):
Référence: http://msdn.microsoft.com/en-us/library/hh213505.aspx
la source
Format
ne conserve pas le type de données mais se convertit implicitement en nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Vous pouvez modifier votre procédure de cette manière
Cependant, cela suppose que vous
EmployeeID
êtes une valeur numérique et que ce code change le résultat en une chaîne, je suggère d'ajouter à nouveau la valeur numérique d'origineEDIT Bien sûr, je n'ai pas lu attentivement la question ci-dessus. Il indique que le champ est un
char(6)
donc 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.la source
'000000'
vraiment nécessaire ..?'0'
fonctionne également très bien. Est-il sécuritaire d'utiliser un seul 0 ..?07135
ne renvoie pas007135
. L'idée générale est de concaténer en une chaîne de 6 caractères composée de toute0
la chaîne EmployeedID convertie, puis de STARTING à partir du bord droit prendre 6 caractères. Quelle que soit la longueur de l'ID, la méthode ci-dessus renvoie toujours une chaîne avec juste le nombre de caractères zéro requis pour atteindre la longueur de 6 caractères'00000'
puisque leEmployeeID
contiendra au moins un chiffre. Mais laREPLICATE()
fonction semble plus adaptée, comme dans les autres réponsesJ'ai détesté avoir à CONVERTIR l'int, et cela semble beaucoup plus simple. Peut-être même plus performant puisqu'il n'y a qu'une seule conversion de chaîne et un simple ajout.
sélectionnez DROITE (1000000 + EmployeeId, 6) ...
Assurez-vous simplement que le "1000000" a au moins autant de zéros que la taille nécessaire.
la source
Je poste tout au même endroit, tout fonctionne pour moi pour compléter avec 4 zéro en tête :)
la source
Une autre façon, juste pour l'exhaustivité.
Ou, selon votre requête
la source
À partir de la version 2012, vous pouvez utiliser
la source
Aussi propre que possible et donne la possibilité de remplacer par des variables:
la source
EmployeeID
colonne est définie commeint
alors l'opérateur + sera traité comme une addition plutôt que comme une concaténation et ainsi les zéros seront perdus. L'utilisationconvert
évitera ce problème.la source
la source
7135.0
quand je l'ai donné7135
.La solution fonctionne pour les nombres signés / négatifs avec des zéros non significatifs, pour toutes les versions de SQL:
la source
Le plus simple est toujours le meilleur:
la source
Dans ma version de SQL, je ne peux pas utiliser REPLICATE. Alors j'ai fait ceci:
la source