Иногда я храню имена объектов (идентификаторы) в некоторых наших базах данных, например в некоторых таблицах параметров. Поскольку я выбираю записи из этих таблиц, используя операторы сравнения '=' или '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 (), чтобы проверить, существует ли таблица TEST таким образом:
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. |
Неважно, если я передам идентификатор TEST с или без скобок, парсер достаточно умен, чтобы снять скобки.
Ну, я могу смоделировать это, добавив скалярную функцию, которая удаляет скобки из одной строки:
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 здесь
источник
[
и]
заменить любой]]
с]
Когда нужны квадратные скобки - это потому, что ваш идентификатор уже является зарезервированным ключевым словом. Их произвольное использование не только не обязательно, но и приводит к путанице, как вы можете видеть.
На мой взгляд, лучше всего избегать использования зарезервированных идентификаторов.
источник