sql >> Databasteknik >  >> RDS >> Sqlserver

Använd PARSENAME() för att returnera en del av ett objektnamn i SQL Server

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


  1. MySQL Master To Master Replikering

  2. Favorittrick för att trimma prestanda

  3. Hur man kör lagrad procedur i MySQL Workbench

  4. Platta ut aggregerade nyckel/värdepar från ett JSONB-fält?