A veces almaceno nombres de objetos (identificadores) en algunas de nuestras bases de datos, por ejemplo, en algunas tablas de parámetros. Debido a que selecciono registros de estas tablas usando los operadores de comparación '=' o 'LIKE', debo tener cuidado de almacenar estos nombres siempre con o sin corchetes .
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
o
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
Sin embargo, MS-SQL tiene algunas funciones donde puede usar nombres de objetos con o sin corchetes, por ejemplo, la función OBJECT_ID (). He configurado un ejemplo mínimo en 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
Ahora puedo usar OBJECT_ID () para verificar si la tabla TEST existe de esta manera:
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. |
No importa si paso el TEST de identificador con o sin paréntesis, el analizador es lo suficientemente inteligente como para eliminar los paréntesis.
Bueno, puedo simular esto agregando una función escalar que elimine los corchetes de una cadena:
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
Y luego úsalo de esta manera:
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
Pero mi pregunta es:
- ¿Hay alguna función incorporada oculta que elimine los corchetes usando T-SQL?
dbfiddle aquí
fuente
[
y]
y reemplazar cualquier]]
con]
Cuando se necesitan corchetes , es porque su identificador ya es una palabra clave reservada. Usarlos arbitrariamente no solo no es necesario, sino que genera mucha confusión, como puede ver.
En mi opinión, la mejor manera es evitar el uso de identificadores reservados en primer lugar.
fuente