sql >> Base de Datos >  >> RDS >> Sqlserver

Use PARSENAME() para devolver parte de un nombre de objeto en SQL Server

En SQL Server, puede usar PARSENAME() función para devolver parte de un nombre de objeto.

Por ejemplo, puede usarlo para devolver la parte del esquema (o cualquier otra parte) de un nombre de cuatro partes como server.schema.db.object .

Sintaxis

La sintaxis es así:

PARSENAME ( 'object_name' , object_piece )

Donde object_name es el nombre del objeto (opcionalmente calificado) y object_piece es la pieza que desea devolver.

El object_piece el argumento debe ser un int entre 1 y 4. El valor determina qué parte del nombre del objeto devolver. Estos valores corresponden a la parte del objeto de la siguiente manera:

Valor Parte del objeto
1 Nombre del objeto
2 Nombre del esquema
3 Nombre de la base de datos
4 Nombre del servidor

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrarlo.

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

Resultado:

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

En este caso, devolví el nombre del servidor de un nombre de objeto de cuatro partes que consiste en el servidor, el esquema, la base de datos y el nombre de la tabla.

Ejemplo 2:devolución de todas las piezas

Esto es lo que parece si devuelvo todas las piezas por separado.

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

Resultado:

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

Ejemplo 3:SQL Server no comprueba el nombre

Es importante saber que PARSENAME() no indica si existe un objeto con el nombre especificado. Simplemente devuelve la parte especificada del nombre de objeto dado.

Por lo tanto, puede pasar cualquier valor a la función, siempre que sea un 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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Resultado:

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

Ejemplo 4:nombre de objeto de tres partes

Esto es lo que sucede si paso un nombre de tres 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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Resultado:

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

Ejemplo 5:nombre de objeto de dos partes

Esto es lo que sucede si paso un nombre de dos 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 [Database],
  PARSENAME(@object_name, 1) AS [Object];

Resultado:

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

Ejemplo 6:nombre de objeto de una parte

Y, por tonto que parezca, un nombre de 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];

Resultado:

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

Ejemplo 7:nombre de objeto de cinco partes

Esto es lo que sucede si proporciona un nombre de objeto con más de cuatro 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:

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

Ejemplo 8:otros usos

Dado que puede proporcionar un nombre de objeto completamente falso, PARSENAME() puede ser un truco útil para dividir otros datos delimitados, como las direcciones 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 |
+-----+-----+-----+-----+

Sin embargo, si realmente necesita hacer esto, considere usar un método diferente, como STRING_SPLIT() .

Ejemplo 9:comas y otros delimitadores

Dado PARSENAME() está diseñado para usarse con nombres de objetos, no puede usar comas como delimitadores y esperar que funcione de la misma manera.

Esto es lo que sucede si trato de hacer eso.

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

Resultado:

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

Deberá reemplazar las comas con un punto si desea hacer eso, o usar un método diferente, como STRING_SPLIT() .