I SQL Server kan du bruge PARSENAME()
funktion til at returnere en del af et objektnavn.
For eksempel kan du bruge det til at returnere skemadelen (eller en hvilken som helst anden del) af et firedelt navn, såsom server.schema.db.object
.
Syntaks
Syntaksen ser sådan ud:
PARSENAME ( 'object_name' , object_piece )
Hvor object_name
er det (valgfrit kvalificerede) objektnavn og object_piece
er den del, du vil have returneret.
object_piece
argument skal være en int mellem 1 og 4. Værdien bestemmer, hvilken del af objektnavnet, der skal returneres. Disse værdier svarer til objektdelen som følger:
Værdi | Objektdel |
---|---|
1 | Objektnavn |
2 | Skemanavn |
3 | Databasenavn |
4 | Servernavn |
Eksempel 1 – Grundlæggende brug
Her er et eksempel til at demonstrere.
SELECT PARSENAME('Homer.dbo.Music.Artists', 4) AS Result;
Resultat:
+----------+ | Result | |----------| | Homer | +----------+
I dette tilfælde returnerede jeg servernavnet fra et firedelt objektnavn bestående af serveren, skemaet, databasen og tabelnavnet.
Eksempel 2 – Returner alle dele
Sådan ser det ud, hvis jeg returnerer alle dele 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 | +----------+----------+------------+----------+
Eksempel 3 – SQL Server kontrollerer ikke navnet
Det er vigtigt at vide, at PARSENAME()
angiver ikke, om der findes et objekt med det angivne navn. Det returnerer blot den specificerede del fra det givne objektnavn.
Derfor kan du overføre enhver værdi til funktionen, så længe den er et gyldigt 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 | +------------+----------+------------+----------+
Eksempel 4 – Tredelt objektnavn
Her er, hvad der sker, hvis jeg videregiver et tredelt navn.
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 | +----------+----------+------------+----------+
Eksempel 5 – Todelt objektnavn
Her er, hvad der sker, hvis jeg videregiver et todelt navn.
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 | +----------+----------+------------+----------+
Eksempel 6 – Et-delt objektnavn
Og, hvor fjollet det end kan virke, et navn i én 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 | +----------+----------+------------+----------+
Eksempel 7 – Femdelt objektnavn
Her er, hvad der sker, hvis du angiver et objektnavn med mere end fire dele.
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 | +----------+----------+------------+----------+
Eksempel 8 – Anden anvendelse
Givet kan du angive et fuldstændigt falsk objektnavn, PARSENAME()
kan være et praktisk hack til at opdele andre afgrænsede 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 hvis du virkelig har brug for at gøre dette, kan du overveje at bruge en anden metode, såsom STRING_SPLIT()
.
Eksempel 9 – Kommaer og andre skilletegn
Givet PARSENAME()
er beregnet til at blive brugt med objektnavne, kan du ikke bruge kommaer som skilletegn og forvente, at det fungerer på samme måde.
Her er, hvad der sker, hvis jeg prøver at gøre 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 skal erstatte kommaerne med en prik, hvis du vil gøre det, eller bruge en anden metode, såsom STRING_SPLIT()
.