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()
.