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

VALORPARTE DO OBJETO
1NOME DO OBJETO
2NOME DO ESQUEMA
3NOME DO BANCO DE DADOS
4NOME 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_REPLACETXT_REVERSEVALUE 01 COM REVERSEVALUE 02 COM REVERSEVALUE 03 COM REVERSEVALUE 04 COM REVERSE
judo.kickboxing.muay thai.jiu-jitsuustij-uij.iaht yaum.gnixobkcik.odujustij-uijiaht yaumgnixobkcikoduj
VALUE 01 – JIU JITSUVALUE 02 – MUAY THAIVALUE 03 – KICKBOXINGVALUE 04 – JUDO
jiu-jitsumuay thaikickboxingjudo

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: