No SQL Server, você pode usar o
PARSENAME()
função para retornar parte de um nome de objeto. Por exemplo, você pode usá-lo para retornar a parte do esquema (ou qualquer outra parte) de um nome de quatro partes, como
server.schema.db.object
. Sintaxe
A sintaxe fica assim:
PARSENAME ( 'object_name' , object_piece )
Onde
object_name
é o nome do objeto (opcionalmente qualificado) e object_piece
é a parte que você quer devolvida. O
object_piece
argumento deve ser um int entre 1 e 4. O valor determina qual parte do nome do objeto deve ser retornada. Esses valores correspondem à parte do objeto da seguinte forma:Valor | Parte do objeto |
---|---|
1 | Nome do objeto |
2 | Nome do esquema |
3 | Nome do banco de dados |
4 | Nome do servidor |
Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT PARSENAME('Homer.dbo.Music.Artists', 4) AS Resultado;
Resultado:
+----------+| Resultado ||----------|| Homero |+----------+
Nesse caso, retornei o nome do servidor de um nome de objeto de quatro partes que consiste no servidor, esquema, banco de dados e nome da tabela.
Exemplo 2 - Devolução de todas as peças
Aqui está o que parece se eu devolver todas as peças separadamente.
DECLARE @object_name char(23) ='Homer.dbo.Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name , 2) AS [Banco de dados], PARSENAME(@object_name, 1) AS [Objeto];
Resultado:
+----------+----------+------------+----------+ | Servidor | Esquema | Banco de dados | Objeto ||----------+----------+------------+----------|| Homero | dbo | Música | Artistas |+----------+----------+------------+----------+Exemplo 3 – SQL Server não verifica o nome
É importante saber quePARSENAME()
não indica se existe um objeto com o nome especificado. Ele apenas retorna a parte especificada do nome do objeto fornecido.
Portanto, você pode passar qualquer valor para a função, desde que seja um sysname válido .
DECLARE @object_name char(28) ='completely.bogus.object.name';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name , 2) AS [Banco de dados], PARSENAME(@object_name, 1) AS [Objeto];
Resultado:
+------------+----------+------------+--------- -+| Servidor | Esquema | Banco de dados | Objeto ||------------+----------+------------+---------- || completamente | falso | objeto | nome |+------------+----------+------------+---------- +Exemplo 4 – Nome do objeto em três partes
Aqui está o que acontece se eu passar um nome de três partes.
DECLARE @object_name char(17) ='dbo.Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name, 2 ) AS [Banco de dados], PARSENAME(@object_name, 1) AS [Objeto];
Resultado:
+----------+----------+------------+----------+ | Servidor | Esquema | Banco de dados | Objeto ||----------+----------+------------+----------|| NULO | dbo | Música | Artistas |+----------+----------+------------+----------+Exemplo 5 - Nome de objeto de duas partes
Aqui está o que acontece se eu passar um nome de duas partes.
DECLARE @object_name char(13) ='Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name, 2) AS [Banco de dados], PARSENAME(@object_name, 1) AS [Objeto];
Resultado:
+----------+----------+------------+----------+ | Servidor | Esquema | Banco de dados | Objeto ||----------+----------+------------+----------|| NULO | NULO | Música | Artistas |+----------+----------+------------+----------+Exemplo 6 – Nome de objeto de uma parte
E, por mais bobo que possa parecer, um nome de uma parte.
DECLARE @object_name char(7) ='Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name, 2) AS [Database ], PARSENAME(@object_name, 1) AS [Objeto];
Resultado:
+----------+----------+------------+----------+ | Servidor | Esquema | Banco de dados | Objeto ||----------+----------+------------+----------|| NULO | NULO | NULO | Artistas |+----------+----------+------------+----------+Exemplo 7 – Nome do objeto em cinco partes
Veja o que acontece se você fornecer um nome de objeto com mais de quatro partes.
DECLARE @object_name char(23) ='Oops.Homer.dbo.Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME( @object_name, 2) AS [Database], PARSENAME(@object_name, 1) AS [Object];
Resultado:
+----------+----------+------------+----------+ | Servidor | Esquema | Banco de dados | Objeto ||----------+----------+------------+----------|| NULO | NULO | NULO | NULL |+----------+----------+------------+----------+Exemplo 8 – Outros usos
Dado que você pode fornecer um nome de objeto completamente falso,PARSENAME()
pode ser um truque útil para dividir outros dados delimitados, como endereços IP4.
DECLARE @object_name char(15) ='172.217.167.110';SELECT PARSENAME(@object_name, 4) AS [4], PARSENAME(@object_name, 3) AS [3], PARSENAME(@object_name, 2) AS [2], PARSENAME(@object_name, 1) AS [1];
Resultado:
+-----+-----+-----+-----+| 4 | 3 | 2 | 1 ||-----+-----+-----+-----|| 172 | 217 | 167 | 110 |+-----+-----+-----+-----+
No entanto, se você realmente precisar fazer isso, considere usar um método diferente, comoSTRING_SPLIT()
.
Exemplo 9 – Vírgulas e outros delimitadores
DadoPARSENAME()
destina-se a ser usado com nomes de objetos, você não pode usar vírgulas como delimitadores e esperar que funcione da mesma forma.
Aqui está o que acontece se eu tentar fazer isso.
DECLARE @object_name char(23) ='Homer,dbo,Music,Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name , 2) AS [Banco de dados], PARSENAME(@object_name, 1) AS [Objeto];
Resultado:
+----------+----------+------------+----------- --------------+| Servidor | Esquema | Banco de dados | Objeto ||----------+----------+------------+------------ -------------|| NULO | NULO | NULO | Homer,dbo,Música,Artistas |+----------+----------+----------------+------ -------------------+
Você precisará substituir as vírgulas por um ponto se quiser fazer isso ou usar um método diferente, comoSTRING_SPLIT()
.