Estou procurando uma função interna / função estendida em T-SQL para manipulação de string semelhante ao String.Format
método em .NET.
89
Se estiver usando o SQL Server 2012 e superior, você pode usar FORMATMESSAGE
. por exemplo.
DECLARE @s NVARCHAR(50) = 'World';
DECLARE @d INT = 123;
SELECT FORMATMESSAGE('Hello %s, %d', @s, @d)
-- RETURNS 'Hello World, 123'
Mais exemplos do 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');
NOTAS:
FORMATMESSAGE
aparecerá como um erro (inofensivo)
msg_number
.string.Format
funcionalidade de estilo no T-SQL, isso é o mais próximo que você obterá.dê uma olhada em xp_sprintf . exemplo abaixo.
O resultado é assim:
Acabei de encontrar um problema com o tamanho máximo (limite de 255 caracteres) da string com isso, então há uma função alternativa que você pode usar:
Para obter o mesmo resultado acima, você chama a função da seguinte maneira:
fonte
Eu criei uma função definida pelo usuário para imitar a funcionalidade string.format. Você pode usar isso.
stringformat-in-sql
fonte
Existe um caminho, mas tem suas limitações. Você pode usar a
FORMATMESSAGE()
função. Ele permite que você formate uma string usando uma formatação semelhante àprintf()
função em C.No entanto, a maior limitação é que ele funcionará apenas com mensagens na tabela sys.messages. Aqui está um artigo sobre isso: microsoft_library_ms186788
É uma pena que não haja uma maneira mais fácil de fazer isso, porque há momentos em que você deseja formatar uma string / varchar no banco de dados. Esperançosamente, você está apenas procurando formatar uma string de maneira padrão e pode usar a
sys.messages
tabela.Coincidentemente, você também pode usar a
RAISERROR()
função com uma gravidade muito baixa, a documentação para raiseerror até menciona fazer isso, mas os resultados são apenas impressos. Então você não seria capaz de fazer nada com o valor resultante (pelo que entendi).Boa sorte!
fonte
FORMATMESSAGE()
está incorreta, no entanto, compreensível porque não está documentada, mas aceitará qualquer string como um primeiro parâmetro, veja esta resposta por @ g2server .O t-sql bruto é limitado a CHARINDEX (), PATINDEX (), REPLACE () e SUBSTRING () para manipulação de string. Mas com o sql server 2005 e posterior você pode configurar funções definidas pelo usuário que rodam em .Net, o que significa que configurar um string.format () UDF não deve ser muito difícil.
fonte
Mais uma ideia.
Embora esta não seja uma solução universal - é simples e funciona, pelo menos para mim :)
Para um marcador de posição {0}:
Para dois marcadores de posição {0} e {1}:
Para três marcadores de posição {0}, {1} e {2}:
e assim por diante...
Tal abordagem nos permite usar essas funções na instrução SELECT e com parâmetros de tipos de dados nvarchar, number, bit e datetime.
Por exemplo:
fonte
Acho que há uma pequena correção durante o cálculo da posição final.
Aqui está a função correta
fonte
Aqui está minha versão. Pode ser estendido para acomodar mais número de parâmetros e pode estender a formatação com base no tipo. Atualmente, apenas os tipos de data e data e hora são formatados.
Exemplo:
Resultado:
Funções:
fonte
aqui está o que descobri com meus experimentos usando o integrado
Função FORMATMESSAGE ()
quando você chama sp_addmessage, seu modelo de mensagem é armazenado na tabela de sistema master.dbo.sysmessages (verificado em SQLServer 2000).
Você mesmo deve gerenciar a adição e a remoção de strings de modelo da tabela, o que é estranho se tudo o que você realmente deseja é enviar uma mensagem rápida para a tela de resultados.
A solução fornecida por Kathik DV parece interessante, mas não funciona com o SQL Server 2000, então alterei um pouco, e esta versão deve funcionar com todas as versões do SQL Server:
Uso:
fonte
No momento, isso realmente não existe (embora você possa, é claro, escrever o seu próprio). Há um bug de conexão aberta para ele: https://connect.microsoft.com/SQLServer/Feedback/Details/3130221 , que até o momento desta escrita tem apenas 1 voto.
fonte
Na verdade, não há nenhuma função interna semelhante à string. A função de formato do .NET está disponível no servidor SQL.
Há uma função FORMATMESSAGE () no servidor SQL, mas ela imita a função printf () de C, não a função string.Format de .NET.
fonte
Não exatamente, mas gostaria de verificar alguns dos artigos sobre manipulação de strings (entre outras coisas) por "Phil Factor" (geddit?) No Simple Talk.
fonte
esta é uma abordagem ruim. você deve trabalhar com dll's assembly, nas quais fará o mesmo por você com melhor desempenho.
fonte