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