Đôi khi tôi lưu trữ tên đối tượng (mã định danh) trong một số cơ sở dữ liệu của chúng tôi, ví dụ như trong một số bảng tham số. Vì tôi chọn các bản ghi từ các bảng này bằng cách sử dụng các toán tử so sánh '=' hoặc 'THÍCH', tôi phải cẩn thận lưu trữ các tên này luôn có hoặc không có dấu ngoặc .
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
hoặc là
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
Tuy nhiên, MS-SQL có một số hàm trong đó bạn có thể sử dụng tên đối tượng có hoặc không có dấu ngoặc, ví dụ: hàm OBJECT_ID (). Tôi đã thiết lập một ví dụ tối thiểu trên dbfiddle.uk .
CREATE TABLE TEST
(
ID INT IDENTITY(1,1) PRIMARY KEY,
OBJECT sysname NOT NULL
);
GO
INSERT INTO TEST VALUES ('[obj1]'),('obj2'),('obj3'),('[obj4]');
GO
Bây giờ tôi có thể sử dụng OBJECT_ID () để kiểm tra xem bảng TEST có tồn tại theo cách này không:
IF OBJECT_ID('TEST') IS NOT NULL
BEGIN
SELECT 'TEST EXISTS.' OBJECT_ID;
END
GO
| OBJECT_ID |
| :----------- |
| TEST EXISTS. |
IF OBJECT_ID('[TEST]') IS NOT NULL
BEGIN
SELECT '[TEST] EXISTS.' OBJECT_ID;
END
GO
| OBJECT_ID |
| :------------- |
| [TEST] EXISTS. |
Không có vấn đề gì nếu tôi vượt qua TEST định danh có hoặc không có dấu ngoặc, trình phân tích cú pháp đủ thông minh để xóa dấu ngoặc.
Chà, tôi có thể mô phỏng điều này bằng cách thêm một hàm vô hướng loại bỏ dấu ngoặc khỏi một chuỗi:
CREATE FUNCTION UNQUOTENAME(@TXT NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
RETURN IIF(LEFT(@TXT, 1) = N'[' AND RIGHT(@TXT, 1) = N']',
SUBSTRING(@TXT, 2, LEN(@TXT) - 2),
@TXT);
END;
GO
Và sau đó sử dụng nó theo cách này:
SELECT dbo.UNQUOTENAME (N'[FIELD]') NAME1, N'FIELD' NAME2;
GO
NAME1 | NAME2
:---- | :----
FIELD | FIELD
SELECT ID, OBJECT
FROM TEST
WHERE OBJECT LIKE 'obj%';
GO
ID | OBJECT
-: | :-----
2 | obj2
3 | obj3
SELECT ID, dbo.UNQUOTENAME(OBJECT)
FROM TEST
WHERE dbo.UNQUOTENAME(OBJECT) LIKE 'obj%';
GO
ID | (No column name)
-: | :---------------
1 | obj1
2 | obj2
3 | obj3
4 | obj4
Nhưng câu hỏi của tôi là:
- Có bất kỳ chức năng tích hợp ẩn nào loại bỏ dấu ngoặc bằng T-SQL không?
dbfiddle ở đây
[
và]
và thay thế bất kỳ]]
với]