Czasami przechowuję nazwy obiektów (identyfikatory) w niektórych naszych bazach danych, na przykład w niektórych tabelach parametrów. Ponieważ wybieram rekordy z tych tabel za pomocą operatorów porównania „=” lub „LIKE”, muszę zadbać o to, aby te nazwy były zawsze przechowywane w nawiasach kwadratowych lub bez nich .
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
lub
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
Jednak MS-SQL ma pewne funkcje, w których można używać nazw obiektów ze nawiasami lub bez, na przykład funkcję OBJECT_ID (). Mam ustawiony minimalny przykład na 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
Teraz mogę użyć OBJECT_ID (), aby sprawdzić, czy tabela TEST istnieje w ten sposób:
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. |
Nie ma znaczenia, czy przejdę identyfikator TEST z nawiasami, czy bez, parser jest wystarczająco inteligentny, aby usunąć nawiasy.
Cóż, mogę to zasymulować, dodając funkcję skalarną, która usuwa nawiasy z jednego ciągu:
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
A następnie użyj go w ten sposób:
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
Ale moje pytanie brzmi:
- Czy jest jakaś ukryta funkcja wbudowana, która usuwa nawiasy za pomocą T-SQL?
dbfiddle tutaj
źródło
[
oraz]
i zastąpić dowolny]]
z]
Kiedy potrzebne są nawiasy kwadratowe - dzieje się tak, ponieważ twój identyfikator jest już zarezerwowanym słowem kluczowym. Używanie ich arbitralnie nie jest nie tylko konieczne, ale prowadzi do wielu nieporozumień.
Moim zdaniem najlepszym sposobem jest uniknięcie używania zastrzeżonych identyfikatorów.
źródło