sql >> Database teknologi >  >> RDS >> Sqlserver

Brug PARSENAME() til at returnere en del af et objektnavn i SQL Server

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


  1. Opret en sammenkædet server mellem to Docker-containere, der kører SQL Server (T-SQL-eksempel)

  2. Hvordan kan (eller kan jeg) VÆLGE DISTINCT på flere kolonner?

  3. Hvordan kan jeg importere data fra ASCII (ISO/IEC 8859-1) til min Rails/PGSQL-database?

  4. Hvordan behandler MySQL ORDER BY og LIMIT i en forespørgsel?