Je recherche une fonction intégrée / une fonction étendue dans T-SQL pour la manipulation de chaînes similaire à la String.Format
méthode dans .NET.
89
Si vous utilisez SQL Server 2012 et versions ultérieures, vous pouvez utiliser FORMATMESSAGE
. par exemple.
DECLARE @s NVARCHAR(50) = 'World';
DECLARE @d INT = 123;
SELECT FORMATMESSAGE('Hello %s, %d', @s, @d)
-- RETURNS 'Hello World, 123'
Plus d'exemples de MSDN: FORMATMESSAGE
SELECT FORMATMESSAGE('Signed int %i, %d %i, %d, %+i, %+d, %+i, %+d', 5, -5, 50, -50, -11, -11, 11, 11);
SELECT FORMATMESSAGE('Signed int with leading zero %020i', 5);
SELECT FORMATMESSAGE('Signed int with leading zero 0 %020i', -55);
SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50);
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal %x, %X, %X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o, %#o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#x, %#X, %#X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Hello %s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %-20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');
REMARQUES:
FORMATMESSAGE
apparaît comme une erreur (inoffensive)
msg_number
.string.Format
fonctionnalité de style dans T-SQL, c'est la plus proche que vous obtiendrez.jetez un œil à xp_sprintf . exemple ci-dessous.
Le résultat ressemble à ceci:
Je viens de trouver un problème avec la taille maximale (limite de 255 caractères) de la chaîne, il existe donc une fonction alternative que vous pouvez utiliser:
Pour obtenir le même résultat que ci-dessus, vous appelez la fonction comme suit:
la source
J'ai créé une fonction définie par l'utilisateur pour imiter la fonctionnalité string.format. Tu peux l'utiliser.
stringformat-in-sql
la source
Il existe un moyen, mais il a ses limites. Vous pouvez utiliser la
FORMATMESSAGE()
fonction. Il vous permet de formater une chaîne en utilisant un formatage similaire à laprintf()
fonction en C.Cependant, la plus grande limitation est qu'elle ne fonctionnera qu'avec les messages de la table sys.messages. Voici un article à ce sujet: microsoft_library_ms186788
C'est un peu dommage qu'il n'y ait pas de moyen plus simple de le faire, car il y a des moments où vous voulez formater une chaîne / varchar dans la base de données. J'espère que vous cherchez uniquement à formater une chaîne de manière standard et que vous pouvez utiliser la
sys.messages
table.Par coïncidence, vous pouvez également utiliser la
RAISERROR()
fonction avec une gravité très faible, la documentation de riseerror mentionne même de le faire, mais les résultats ne sont imprimés. Vous ne pourriez donc rien faire avec la valeur résultante (d'après ce que je comprends).Bonne chance!
la source
FORMATMESSAGE()
est incorrecte, cependant compréhensible car elle n'est pas documentée, mais elle acceptera n'importe quelle chaîne comme premier paramètre, voir cette réponse par @ g2server .Le t-sql brut est limité à CHARINDEX (), PATINDEX (), REPLACE () et SUBSTRING () pour la manipulation de chaînes. Mais avec SQL Server 2005 et les versions ultérieures, vous pouvez configurer des fonctions définies par l'utilisateur qui s'exécutent dans .Net, ce qui signifie que la configuration d'un UDF string.format () ne devrait pas être trop difficile.
la source
Encore une idée.
Bien que ce ne soit pas une solution universelle - c'est simple et fonctionne, du moins pour moi :)
Pour un espace réservé {0}:
Pour deux espaces réservés {0} et {1}:
Pour trois espaces réservés {0}, {1} et {2}:
etc...
Une telle approche nous permet d'utiliser ces fonctions dans l'instruction SELECT et avec des paramètres de types de données nvarchar, number, bit et datetime.
Par exemple:
la source
Je pense qu'il y a une petite correction lors du calcul de la position finale.
Voici la fonction correcte
la source
Voici ma version. Peut être étendu pour accueillir plus de paramètres et peut étendre la mise en forme en fonction du type. Actuellement, seuls les types date et date / heure sont formatés.
Exemple:
Production:
Les fonctions:
la source
voici ce que j'ai trouvé avec mes expériences en utilisant le
Fonction FORMATMESSAGE ()
lorsque vous appelez sp_addmessage, votre modèle de message est stocké dans la table système master.dbo.sysmessages (vérifiée sur SQLServer 2000).
Vous devez gérer vous-même l'ajout et la suppression des chaînes de modèle de la table, ce qui est gênant si tout ce que vous voulez vraiment est d'afficher un message rapide sur l'écran des résultats.
La solution fournie par Kathik DV, semble intéressante mais ne fonctionne pas avec SQL Server 2000, donc je l'ai un peu modifiée, et cette version devrait fonctionner avec toutes les versions de SQL Server:
Usage:
la source
Pour le moment, cela n'existe pas vraiment (bien que vous puissiez bien sûr écrire le vôtre). Il existe un bogue de connexion ouverte pour cela: https://connect.microsoft.com/SQLServer/Feedback/Details/3130221 , qui, à ce jour, n'a qu'un vote.
la source
En fait, il n'y a pas de fonction intégrée similaire à string.Format fonction de .NET est disponible dans SQL Server.
Il existe une fonction FORMATMESSAGE () dans le serveur SQL mais elle imite la fonction printf () de C et non la fonction string.Format de .NET.
la source
Pas exactement, mais je consulterais certains des articles sur la gestion des chaînes (entre autres) de "Phil Factor" (geddit?) Sur Simple Talk.
la source
c'est une mauvaise approche. vous devriez travailler avec des DLL d'assemblage, qui feront de même pour vous avec de meilleures performances.
la source