Trong SQL Server, bạn có thể sử dụng PARSENAME()
hàm để trả về một phần của tên đối tượng.
Ví dụ:bạn có thể sử dụng nó để trả về phần lược đồ (hoặc bất kỳ phần nào khác) của tên bốn phần như server.schema.db.object
.
Cú pháp
Cú pháp như sau:
PARSENAME ( 'object_name' , object_piece )
Nơi object_name
là tên đối tượng (tùy chọn đủ điều kiện) và object_piece
là phần mà bạn muốn trả lại.
object_piece
đối số phải là int từ 1 đến 4. Giá trị xác định phần nào của tên đối tượng sẽ trả về. Các giá trị này tương ứng với phần đối tượng như sau:
Giá trị | Phần đối tượng |
---|---|
1 | Tên đối tượng |
2 | Tên giản đồ |
3 | Tên cơ sở dữ liệu |
4 | Tên máy chủ |
Ví dụ 1 - Cách sử dụng cơ bản
Đây là một ví dụ để chứng minh.
SELECT PARSENAME('Homer.dbo.Music.Artists', 4) AS Result;
Kết quả:
+----------+ | Result | |----------| | Homer | +----------+
Trong trường hợp này, tôi đã trả lại tên máy chủ từ tên đối tượng bốn phần bao gồm máy chủ, lược đồ, cơ sở dữ liệu và tên bảng.
Ví dụ 2 - Trả lại tất cả các bộ phận
Đây là giao diện nếu tôi trả lại tất cả các bộ phận một cách riêng biệt.
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];
Kết quả:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | Homer | dbo | Music | Artists | +----------+----------+------------+----------+
Ví dụ 3 - Máy chủ SQL không kiểm tra tên
Điều quan trọng cần biết là PARSENAME()
không cho biết một đối tượng theo tên đã chỉ định có tồn tại hay không. Nó chỉ trả về phần được chỉ định từ tên đối tượng đã cho.
Do đó, bạn có thể chuyển bất kỳ giá trị nào cho hàm, miễn là giá trị của nó là sysname hợp lệ .
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];
Kết quả:
+------------+----------+------------+----------+ | Server | Schema | Database | Object | |------------+----------+------------+----------| | completely | bogus | object | name | +------------+----------+------------+----------+
Ví dụ 4 - Tên đối tượng ba phần
Đây là những gì sẽ xảy ra nếu tôi chuyển một tên gồm ba phần.
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];
Kết quả:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | dbo | Music | Artists | +----------+----------+------------+----------+
Ví dụ 5 - Tên đối tượng hai phần
Đây là những gì sẽ xảy ra nếu tôi chuyển một tên gồm hai phần.
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];
Kết quả:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | NULL | Music | Artists | +----------+----------+------------+----------+
Ví dụ 6 - Tên đối tượng một phần
Và, tưởng chừng như nó có vẻ ngớ ngẩn, một cái tên chỉ có một phần.
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];
Kết quả:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | NULL | NULL | Artists | +----------+----------+------------+----------+
Ví dụ 7 - Tên đối tượng gồm năm phần
Đây là điều sẽ xảy ra nếu bạn cung cấp tên đối tượng có nhiều hơn bốn phần.
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];
Kết quả:
+----------+----------+------------+----------+ | Server | Schema | Database | Object | |----------+----------+------------+----------| | NULL | NULL | NULL | NULL | +----------+----------+------------+----------+
Ví dụ 8 - Sử dụng Khác
Vì bạn có thể cung cấp tên đối tượng hoàn toàn không có thật, PARSENAME()
có thể là một thủ thuật hữu dụng để chia nhỏ dữ liệu được phân tách khác, chẳng hạn như địa chỉ 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];
Kết quả:
+-----+-----+-----+-----+ | 4 | 3 | 2 | 1 | |-----+-----+-----+-----| | 172 | 217 | 167 | 110 | +-----+-----+-----+-----+
Tuy nhiên, nếu bạn thực sự cần làm điều này, hãy xem xét sử dụng một phương pháp khác, chẳng hạn như STRING_SPLIT()
.
Ví dụ 9 - Dấu phẩy và các dấu phân cách khác
Đã cho PARSENAME()
nhằm mục đích sử dụng với tên đối tượng, bạn không thể sử dụng dấu phẩy làm dấu phân cách và mong nó hoạt động giống nhau.
Đây là những gì sẽ xảy ra nếu tôi cố gắng làm điều đó.
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];
Kết quả:
+----------+----------+------------+-------------------------+ | Server | Schema | Database | Object | |----------+----------+------------+-------------------------| | NULL | NULL | NULL | Homer,dbo,Music,Artists | +----------+----------+------------+-------------------------+
Bạn cần thay thế dấu phẩy bằng dấu chấm nếu bạn muốn làm điều đó hoặc sử dụng một phương pháp khác, chẳng hạn như STRING_SPLIT()
.