Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzare PARSENAME() per restituire parte di un nome oggetto in SQL Server

In SQL Server puoi utilizzare PARSENAME() funzione per restituire parte del nome di un oggetto.

Ad esempio, puoi usarlo per restituire la parte dello schema (o qualsiasi altra parte) di un nome in quattro parti come server.schema.db.object .

Sintassi

La sintassi è questa:

PARSENAME ( 'object_name' , object_piece )

Dove object_name è il nome dell'oggetto (qualificato facoltativamente) e object_piece è la parte che vuoi restituire.

Il object_piece l'argomento deve essere un int tra 1 e 4. Il valore determina quale parte del nome dell'oggetto restituire. Questi valori corrispondono alla parte oggetto come segue:

Valore Parte oggetto
1 Nome oggetto
2 Nome schema
3 Nome database
4 Nome server

Esempio 1 – Utilizzo di base

Ecco un esempio da dimostrare.

SELECT PARSENAME('Homer.dbo.Music.Artists', 4) AS Result;

Risultato:

+----------+
| Result   |
|----------|
| Homer    |
+----------+

In questo caso ho restituito il nome del server da un nome oggetto in quattro parti composto da server, schema, database e nome della tabella.

Esempio 2 – Restituisci tutte le parti

Ecco come appare se restituisco tutte le parti separatamente.

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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Risultato:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| Homer    | dbo      | Music      | Artists  |
+----------+----------+------------+----------+

Esempio 3:SQL Server non verifica il nome

È importante sapere che PARSENAME() non indica se esiste un oggetto con il nome specificato. Restituisce semplicemente la parte specificata dal nome oggetto specificato.

Pertanto, puoi passare qualsiasi valore alla funzione, purché sia ​​un sysname valido .

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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Risultato:

+------------+----------+------------+----------+
| Server     | Schema   | Database   | Object   |
|------------+----------+------------+----------|
| completely | bogus    | object     | name     |
+------------+----------+------------+----------+

Esempio 4 – Nome oggetto in tre parti

Ecco cosa succede se trasmetto un nome in tre parti.

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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Risultato:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | dbo      | Music      | Artists  |
+----------+----------+------------+----------+

Esempio 5 – Nome oggetto in due parti

Ecco cosa succede se trasmetto un nome in due parti.

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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Risultato:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | NULL     | Music      | Artists  |
+----------+----------+------------+----------+

Esempio 6 – Nome oggetto in una parte

E, per quanto sciocco possa sembrare, un nome in una sola 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 [Object];

Risultato:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | NULL     | NULL       | Artists  |
+----------+----------+------------+----------+

Esempio 7 – Nome oggetto in cinque parti

Ecco cosa succede se fornisci un nome oggetto con più di quattro parti.

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];

Risultato:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | NULL     | NULL       | NULL     |
+----------+----------+------------+----------+

Esempio 8 – Altri usi

Dato che puoi fornire un nome oggetto completamente fasullo, PARSENAME() può essere un pratico trucco per dividere altri dati delimitati, come gli indirizzi 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];

Risultato:

+-----+-----+-----+-----+
| 4   | 3   | 2   | 1   |
|-----+-----+-----+-----|
| 172 | 217 | 167 | 110 |
+-----+-----+-----+-----+

Tuttavia, se hai davvero bisogno di farlo, considera l'utilizzo di un metodo diverso, come STRING_SPLIT() .

Esempio 9 – Virgole e altri delimitatori

Dato PARSENAME() deve essere utilizzato con i nomi degli oggetti, non puoi usare le virgole come delimitatori e aspettarti che funzioni allo stesso modo.

Ecco cosa succede se provo a farlo.

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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Risultato:

+----------+----------+------------+-------------------------+
| Server   | Schema   | Database   | Object                  |
|----------+----------+------------+-------------------------|
| NULL     | NULL     | NULL       | Homer,dbo,Music,Artists |
+----------+----------+------------+-------------------------+

Dovresti sostituire le virgole con un punto se vuoi farlo, o usare un metodo diverso, come STRING_SPLIT() .