Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Use PARSENAME() para retornar parte de um nome de objeto no SQL Server


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 que PARSENAME() 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, como STRING_SPLIT() .

Exemplo 9 – Vírgulas e outros delimitadores


Dado PARSENAME() 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, como STRING_SPLIT() .