Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Użyj PARSENAME(), aby zwrócić część nazwy obiektu w SQL Server

W SQL Server możesz użyć PARSENAME() funkcja zwracająca część nazwy obiektu.

Na przykład można go użyć do zwrócenia części schematu (lub dowolnej innej części) czteroczęściowej nazwy, takiej jak server.schema.db.object .

Składnia

Składnia wygląda tak:

PARSENAME ( 'object_name' , object_piece )

Gdzie object_name to (opcjonalnie kwalifikowana) nazwa obiektu i object_piece to część, którą chcesz zwrócić.

object_piece argument musi być int od 1 do 4. Wartość określa, która część nazwy obiektu ma zostać zwrócona. Wartości te odpowiadają części obiektu w następujący sposób:

Wartość Część obiektu
1 Nazwa obiektu
2 Nazwa schematu
3 Nazwa bazy danych
4 Nazwa serwera

Przykład 1 – Podstawowe użycie

Oto przykład do zademonstrowania.

SELECT PARSENAME('Homer.dbo.Music.Artists', 4) AS Result;

Wynik:

+----------+
| Result   |
|----------|
| Homer    |
+----------+

W tym przypadku zwróciłem nazwę serwera z czteroczęściowej nazwy obiektu składającej się z serwera, schematu, bazy danych i nazwy tabeli.

Przykład 2 – Zwróć wszystkie części

Oto jak to wygląda, jeśli zwrócę wszystkie części osobno.

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];

Wynik:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| Homer    | dbo      | Music      | Artists  |
+----------+----------+------------+----------+

Przykład 3 – SQL Server nie sprawdza nazwy

Ważne jest, aby wiedzieć, że PARSENAME() nie wskazuje, czy istnieje obiekt o określonej nazwie. Zwraca jedynie określoną część z podanej nazwy obiektu.

Dlatego możesz przekazać do funkcji dowolną wartość, o ile jest to poprawna nazwa sys .

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];

Wynik:

+------------+----------+------------+----------+
| Server     | Schema   | Database   | Object   |
|------------+----------+------------+----------|
| completely | bogus    | object     | name     |
+------------+----------+------------+----------+

Przykład 4 – Trzyczęściowa nazwa obiektu

Oto, co się stanie, jeśli przekażę trzyczęściowe imię.

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];

Wynik:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | dbo      | Music      | Artists  |
+----------+----------+------------+----------+

Przykład 5 – Dwuczęściowa nazwa obiektu

Oto, co się stanie, jeśli przekażę dwuczęściową nazwę.

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];

Wynik:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | NULL     | Music      | Artists  |
+----------+----------+------------+----------+

Przykład 6 – Jednoczęściowa nazwa obiektu

I, jakkolwiek głupie może się wydawać, jednoczęściowa nazwa.

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];

Wynik:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | NULL     | NULL       | Artists  |
+----------+----------+------------+----------+

Przykład 7 – pięcioczęściowa nazwa obiektu

Oto, co się stanie, jeśli podasz nazwę obiektu zawierającą więcej niż cztery części.

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];

Wynik:

+----------+----------+------------+----------+
| Server   | Schema   | Database   | Object   |
|----------+----------+------------+----------|
| NULL     | NULL     | NULL       | NULL     |
+----------+----------+------------+----------+

Przykład 8 – Inne zastosowania

Biorąc pod uwagę, że możesz podać całkowicie fałszywą nazwę obiektu, PARSENAME() może być przydatnym hackiem do dzielenia innych rozdzielanych danych, takich jak adresy IP4.

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];

Wynik:

+-----+-----+-----+-----+
| 4   | 3   | 2   | 1   |
|-----+-----+-----+-----|
| 172 | 217 | 167 | 110 |
+-----+-----+-----+-----+

Jeśli jednak naprawdę musisz to zrobić, rozważ użycie innej metody, takiej jak STRING_SPLIT() .

Przykład 9 – przecinki i inne ograniczniki

Biorąc pod uwagę PARSENAME() jest przeznaczony do użytku z nazwami obiektów, nie możesz używać przecinków jako ograniczników i oczekiwać, że będzie działać tak samo.

Oto, co się stanie, jeśli spróbuję to zrobić.

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];

Wynik:

+----------+----------+------------+-------------------------+
| Server   | Schema   | Database   | Object                  |
|----------+----------+------------+-------------------------|
| NULL     | NULL     | NULL       | Homer,dbo,Music,Artists |
+----------+----------+------------+-------------------------+

Jeśli chcesz to zrobić, musisz zastąpić przecinki kropką lub użyć innej metody, takiej jak STRING_SPLIT() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Implementacja wyszukiwania pełnotekstowego w SQL Server 2016 dla początkujących

  2. Jakie są główne różnice w wydajności między typami danych varchar i nvarchar SQL Server?

  3. Zapytanie, które zwraca hierarchiczną listę typów zdarzeń wyzwalających w SQL Server

  4. LINQ to SQL Take bez pomijania powoduje wiele instrukcji SQL

  5. Rozwiązania dotyczące bezbłędnego odczytywania pliku dziennika transakcji programu SQL Server