Olá galera o/
Nesta postagem vou mostrar como utilizar a função PARSENAME() para retornar parte do nome de um objeto.
A ideia deste post surgiu por conta de um problema que eu tive no meu trabalho atual. O cenário foi o seguinte, eu necessitava separar uma string que era composta por _ (Underline) em 3 colunas diferentes, ou seja, o texto era composto da seguinte maneira TXT1_TXT2_TXT3. Após tentar fazer essa separação utilizando a função substring (POST SOBRE SUBSTRING), que infelizmente não funcionou da maneira mais performática. Terminei substituindo a mesma pela função PARSENAME, além do código ficar mais legível, também ficou muito mais simples tratar o cenário em questão.
Sintaxe:
PARSENAME (NOME_DO_OBJETO, PARTE_DO_OBJETO)
Onde NOME_DO_OBJETO é o nome do objeto ou texto que queremos utilizar, a PARTE_DO_OBJETO é a parte que você deseja retornar. Este último parâmetro deve ser do tipo INT com valores entre 1 e 4. O valor determina qual parte do nome do objeto será retornardo. Esses valores correspondem à parte do objeto da seguinte maneira:
Segue link da função no site da Microsoft: https://docs.microsoft.com/pt-br/sql/t-sql/functions/parsename-transact-sql?view=sql-server-ver15
VALOR | PARTE DO OBJETO |
1 | NOME DO OBJETO |
2 | NOME DO ESQUEMA |
3 | NOME DO BANCO DE DADOS |
4 | NOME DO SERVIDOR |
Obs.01: Se qualquer parte do nome conter exceder o tamanho de nvarchar(128)/256 bytes o parsename retornará nulo para o mesmo.
Obs.02: Esta função não lê alguns delimitadores como espaço em branco (‘ ‘), virgulas ( , ), barra invertida ( / ), dois pontos ( : ), underline( _ ), traço ( – ), pipe ( | ), estão devemos substituir os mesmos por ponto ( . ) utilizando a função REPLACE (POST SOBRE REPLACE).
Obs.03: Se tentar extrair a quarta parte de um objeto que contém 3 partes a última retornará nulo.
Obs.04: Lembrar que, a leitura é feita da primeira parte para a última, ou seja , se você deseja extrair o primeiro nome, é necessário utilizar valor 4, a segunda parte com o valor 3, a terceira parte com o valor 2 e a quarta parte com o valor 1.
Agora vamos para a parte prática, pois assim conseguiremos entender os cenários.
Ex.01: Exibir as 4 partes de um texto em colunas separadas, extraindo de um texto que contem 4 partes, ou seja, server + schema + database + objeto (table, view, procedure e etc.). Percebam que, quando colocamos o segundo parâmetro do parsename como 1 ele lê o última parte do nome primeiro, neste caso, o nome da Tabela.
declare @txt varchar (100)
set @txt = 'SQLEXPRESS2019.dbo.ProjectDataLuiz.Customers'
select
PARSENAME(@txt, 1) as 'Table Name',
PARSENAME(@txt, 2) as 'Database Name',
PARSENAME(@txt, 3) as 'Schema Name',
PARSENAME(@txt, 4) as 'Server Name'
Ex.02: Exibir as 4 partes de um texto em colunas separadas, extraindo de um texto que contem 3 partes, ou seja, schema + database + objeto (table, view, procedure e etc.), porém , vamos tentar trazer a 4 parte do nome, que não existe na string em questão. Percebam que ele retornou nulo, quando ele não encontra uma das partes.
declare @txt varchar (100)
set @txt = 'dbo.ProjectDataLuiz.Customers'
select
PARSENAME(@txt, 1) as 'Table Name',
PARSENAME(@txt, 2) as 'Database Name',
PARSENAME(@txt, 3) as 'Schema Name',
PARSENAME(@txt, 4) as 'Server Name'
Ex.03: Exibir as 4 partes de um texto em colunas separadas, extraindo de um texto que contem 5 partes. Percebam que, ao passar um valor com 5 partes, todos as saídas exibem o valor nulo.
declare @txt varchar (100)
set @txt = 'txt1.txt2.txt3.txt4.txt5'
select
PARSENAME(@txt, 1) as 'Value 1',
PARSENAME(@txt, 2) as 'Value 2',
PARSENAME(@txt, 3) as 'Value 3',
PARSENAME(@txt, 4) as 'Value 4'
Ex.04: Exibir as 4 partes de um IP em colunas separadas, extraindo de um texto que contem 4 partes. Percebam que inverti a ordem de exibição das colunas para trazer o parsename que contém o valor 4 primeiro.
declare @txt varchar (100)
set @txt = '100.101.103.104'
select
PARSENAME(@txt, 4) as 'Nº 01 IP',
PARSENAME(@txt, 3) as 'Nº 02 IP',
PARSENAME(@txt, 2) as 'Nº 03 IP',
PARSENAME(@txt, 1) as 'Nº 04 IP'
Ex.05: Tentar exibir um texto com outros delimitadores. Percebem que, ele exibe apenas o valor na primeira coluna, ou seja, a que tem o valor 1 na parte do objeto, as demais colunas retornam nulo. Ele espera que o delimitador das partes seja o ponto ( . ).
declare @txt varchar (100)
set @txt = 'judo, kickboxing, muay thai, jiu-jitsu'
select
PARSENAME(@txt, 1) as 'VALUE 01',
PARSENAME(@txt, 2) as 'VALUE 02',
PARSENAME(@txt, 3) as 'VALUE 03',
PARSENAME(@txt, 4) as 'VALUE 04'
Ex.06: O cenário do exemplo 05 é semelhante ao cenário que aconteceu no meu emprego atual.
Imaginem que eu quero exibir o jiu-jitsu como a primeira coluna (PARTE_DO_OBJETO = 4), o muay thai como a segunda coluna (PARTE_DO_OBJETO = 3), o kickboxing como a terceira coluna (PARTE_DO_OBJETO = 2) e a judo como a quarta coluna (PARTE_DO_OBJETO = 1). Porém, não podemos mudar a posição da string na variável.
Quais as etapas a serem executadas para resolver esse problema:
1 – Trocar a vírgula e o espaço (, ) por ponto utilizando o REPLACE.
2 – Inverter os textos com os dados alterados utilizando a função REVERSE (POST SOBRE O REVERSE). Ex.: Luiz >REVERSE > ziul
3 – Aplicar o PARSENAME
4 – Aplicar o reverse para “desvirar” os textos
declare @txt varchar (100)
set @txt = 'judo, kickboxing, muay thai, jiu-jitsu'
select
REPLACE(@txt,', ','.') as TXT_REPLACE,
REVERSE(REPLACE(@txt,', ','.')) as TXT_REVERSE,
PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 4) as 'VALUE 01 COM REVERSE',
PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 3) as 'VALUE 02 COM REVERSE',
PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 2) as 'VALUE 03 COM REVERSE',
PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 1) as 'VALUE 04 COM REVERSE'
select
REVERSE(PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 4)) as 'VALUE 01 - JIU JITSU',
REVERSE(PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 3)) as 'VALUE 02 - MUAY THAI',
REVERSE(PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 2)) as 'VALUE 03 - KICKBOXING',
REVERSE(PARSENAME(REVERSE(REPLACE(@txt,', ','.')), 1)) as 'VALUE 04 - JUDO'
TXT_REPLACE | TXT_REVERSE | VALUE 01 COM REVERSE | VALUE 02 COM REVERSE | VALUE 03 COM REVERSE | VALUE 04 COM REVERSE |
judo.kickboxing.muay thai.jiu-jitsu | ustij-uij.iaht yaum.gnixobkcik.oduj | ustij-uij | iaht yaum | gnixobkcik | oduj |
VALUE 01 – JIU JITSU | VALUE 02 – MUAY THAI | VALUE 03 – KICKBOXING | VALUE 04 – JUDO |
jiu-jitsu | muay thai | kickboxing | judo |
A postagem de hoje acaba por aqui, espero que tenham entendido como utilizar a função PARSENAME e a utilização desta função seja útil nos seus estudos ou no seu trabalho.
Desejo a todos uma boa leitura, boa prática e bons estudos.
Para quem quer estudar:
- Para a Certificação Microsoft MTA Database Fundamentals | Banco de Dados Relacional e Linguagem T-SQL.
- Segue o link do curso na Udemy. >> LINK <<
- Sobre Bancos da Dados no Azure
- Segue o link do curso na Udemy. >> LINK <<
Não se esqueçam de avaliar esta postagem através da ESTRELAS abaixo das redes sociais, isso vai me ajudar muito a melhorar as postagens.
Quem quiser mandar comentários, sugestões, criticas e complementos, fiquem a vontade, pois feedbacks positivos ou negativos engradecem meu conhecimento para que possa melhorar as postagem para vocês.
Até a próxima o/
Acessem nossas Redes Sociais: