บางครั้งฉันเก็บชื่อวัตถุ (ตัวระบุ) ในฐานข้อมูลของเราเช่นในตารางพารามิเตอร์บางตัว เพราะผมเลือกระเบียนจากตารางเหล่านี้โดยใช้ '=' หรือ 'LIKE' ดำเนินการเปรียบเทียบผมจะต้องดูแลเพื่อเก็บชื่อเหล่านี้มักจะมีหรือไม่มีวงเล็บ
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
หรือ
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
อย่างไรก็ตาม MS-SQL มีฟังก์ชั่นบางอย่างที่คุณสามารถใช้ชื่อวัตถุที่มีหรือไม่มีวงเล็บตัวอย่างเช่นฟังก์ชัน OBJECT_ID () ฉันได้ตั้งค่าตัวอย่างน้อยที่สุดใน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
ตอนนี้ฉันสามารถใช้ OBJECT_ID () เพื่อตรวจสอบว่ามีการทดสอบตารางด้วยวิธีนี้หรือไม่:
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. |
ไม่สำคัญว่าถ้าฉันผ่านการทดสอบตัวระบุโดยมีหรือไม่มีวงเล็บตัวแยกวิเคราะห์จะฉลาดพอที่จะลบวงเล็บ
ฉันสามารถจำลองได้โดยการเพิ่มฟังก์ชันสเกลาร์ที่ลบวงเล็บออกจากสตริงหนึ่ง:
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
แล้วใช้วิธีนี้:
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
แต่คำถามของฉันคือ:
- มีฟังก์ชั่นในตัวที่ซ่อนอยู่ซึ่งลบวงเล็บโดยใช้ T-SQL หรือไม่?
dbfiddle ที่นี่
[
และ]
และแทนที่]]
ด้วย]