Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden Sie PARSENAME(), um einen Teil eines Objektnamens in SQL Server zurückzugeben

In SQL Server können Sie den PARSENAME() verwenden Funktion, um einen Teil eines Objektnamens zurückzugeben.

Beispielsweise können Sie es verwenden, um den Schemateil (oder jeden anderen Teil) eines vierteiligen Namens wie server.schema.db.object zurückzugeben .

Syntax

Die Syntax lautet wie folgt:

PARSENAME ( 'object_name' , object_piece )

Wobei object_name ist der (optional qualifizierte) Objektname und object_piece ist der Teil, den Sie zurückgeben möchten.

Das object_piece argument muss ein int sein zwischen 1 und 4. Der Wert bestimmt, welcher Teil des Objektnamens zurückgegeben werden soll. Diese Werte entsprechen dem Objektteil wie folgt:

Wert Objektteil
1 Objektname
2 Schemaname
3 Datenbankname
4 Servername

Beispiel 1 – Grundlegende Verwendung

Hier ist ein Beispiel zur Veranschaulichung.

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

Ergebnis:

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

In diesem Fall habe ich den Servernamen aus einem vierteiligen Objektnamen zurückgegeben, der aus dem Server-, Schema-, Datenbank- und Tabellennamen besteht.

Beispiel 2 – Alle Teile zurücksenden

So sieht es aus, wenn ich alle Teile einzeln zurücksende.

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

Ergebnis:

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

Beispiel 3 – SQL Server überprüft den Namen nicht

Es ist wichtig zu wissen, dass PARSENAME() gibt nicht an, ob ein Objekt mit dem angegebenen Namen existiert. Es gibt lediglich den angegebenen Teil des angegebenen Objektnamens zurück.

Daher können Sie der Funktion jeden beliebigen Wert übergeben, solange es sich um einen gültigen sysname handelt .

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

Ergebnis:

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

Beispiel 4 – Dreiteiliger Objektname

Folgendes passiert, wenn ich einen dreiteiligen Namen übergebe.

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

Ergebnis:

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

Beispiel 5 – Zweiteiliger Objektname

Folgendes passiert, wenn ich einen zweiteiligen Namen übergebe.

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

Ergebnis:

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

Beispiel 6 – Einteiliger Objektname

Und, so albern es auch scheinen mag, ein einteiliger Name.

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

Ergebnis:

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

Beispiel 7 – Fünfteiliger Objektname

Folgendes passiert, wenn Sie einen Objektnamen mit mehr als vier Teilen angeben.

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

Ergebnis:

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

Beispiel 8 – Andere Verwendungen

Vorausgesetzt, Sie können einen völlig falschen Objektnamen angeben, PARSENAME() kann ein praktischer Hack sein, um andere begrenzte Daten wie IP4-Adressen aufzuteilen.

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

Ergebnis:

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

Wenn Sie dies jedoch wirklich tun müssen, ziehen Sie die Verwendung einer anderen Methode in Betracht, z. B. STRING_SPLIT() .

Beispiel 9 – Kommas und andere Trennzeichen

Gegeben PARSENAME() für die Verwendung mit Objektnamen vorgesehen ist, können Sie keine Kommas als Trennzeichen verwenden und davon ausgehen, dass es genauso funktioniert.

Folgendes passiert, wenn ich das versuche.

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

Ergebnis:

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

Sie müssen die Kommas durch einen Punkt ersetzen, wenn Sie dies tun möchten, oder eine andere Methode verwenden, z. B. STRING_SPLIT() .