I SQL Server kan du använda PARSENAME()
funktion för att returnera en del av ett objektnamn.
Du kan till exempel använda den för att returnera schemadelen (eller någon annan del) av ett fyrdelat namn som server.schema.db.object
.
Syntax
Syntaxen ser ut så här:
PARSENAME ( 'object_name' , object_piece )
Där object_name
är det (valfritt kvalificerade) objektnamnet och object_piece
är den del du vill ha tillbaka.
object_piece
argumentet måste vara ett int mellan 1 och 4. Värdet avgör vilken del av objektnamnet som ska returneras. Dessa värden motsvarar objektdelen enligt följande:
Värde | Objektdel |
---|---|
1 | Objektnamn |
2 | Schemanamn |
3 | Databasnamn |
4 | Servernamn |
Exempel 1 – Grundläggande användning
Här är ett exempel att visa.
SELECT PARSENAME('Homer.dbo.Music.Artists', 4) AS Result;
Resultat:
+----------+ | Result | |----------| | Homer | +----------+
I det här fallet returnerade jag servernamnet från ett fyradelat objektnamn bestående av servern, schemat, databasen och tabellnamnet.
Exempel 2 – Returnera alla delar
Så här ser det ut om jag returnerar alla delar separat.
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];
Resultat:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | Homer | dbo | Music | Artists | +----------+----------+------------+----------+
Exempel 3 – SQL Server kontrollerar inte namnet
Det är viktigt att veta att PARSENAME()
indikerar inte om ett objekt med det angivna namnet existerar. Den returnerar bara den specificerade delen från det givna objektnamnet.
Därför kan du skicka vilket värde som helst till funktionen, så länge det är ett giltigt sysname .
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];
Resultat:
+------------+----------+------------+----------+ | Server | Schema | Database | Object | |------------+----------+------------+----------| | completely | bogus | object | name | +------------+----------+------------+----------+
Exempel 4 – Tredelat objektnamn
Det här är vad som händer om jag skickar ett tredelat namn.
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];
Resultat:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | dbo | Music | Artists | +----------+----------+------------+----------+
Exempel 5 – Tvådelat objektnamn
Det här är vad som händer om jag skickar ett tvådelat namn.
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];
Resultat:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | NULL | Music | Artists | +----------+----------+------------+----------+
Exempel 6 – Endelad objektnamn
Och, hur fånigt det än kan verka, ett namn i en del.
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];
Resultat:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | NULL | NULL | Artists | +----------+----------+------------+----------+
Exempel 7 – Femdelat objektnamn
Så här händer om du anger ett objektnamn med fler än fyra delar.
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];
Resultat:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | NULL | NULL | NULL | +----------+----------+------------+----------+
Exempel 8 – Annan användning
Givet kan du ange ett helt falskt objektnamn, PARSENAME()
kan vara ett praktiskt hack för att dela upp andra avgränsade data, såsom IP4-adresser.
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];
Resultat:
+-----+-----+-----+-----+ | 4 | 3 | 2 | 1 | |-----+-----+-----+-----| | 172 | 217 | 167 | 110 | +-----+-----+-----+-----+
Men om du verkligen behöver göra detta, överväg att använda en annan metod, till exempel STRING_SPLIT()
.
Exempel 9 – Komma och andra avgränsare
Givet PARSENAME()
är avsedd att användas med objektnamn, du kan inte använda kommatecken som avgränsare och förvänta dig att det fungerar likadant.
Det här är vad som händer om jag försöker göra det.
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];
Resultat:
+----------+----------+------------+-------------------------+ | Server | Schema | Database | Object | |----------+----------+------------+-------------------------| | NULL | NULL | NULL | Homer,dbo,Music,Artists | +----------+----------+------------+-------------------------+
Du måste ersätta kommatecken med en punkt om du vill göra det, eller använda en annan metod, till exempel STRING_SPLIT()
.