Às vezes, guardo nomes de objetos (identificadores) em alguns de nossos bancos de dados, por exemplo, em algumas tabelas de parâmetros. Como seleciono registros dessas tabelas usando os operadores de comparação '=' ou 'LIKE', devo ter o cuidado de armazenar esses nomes sempre com ou sem colchetes .
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
ou
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
No entanto, o MS-SQL possui algumas funções nas quais você pode usar nomes de objetos com ou sem colchetes, por exemplo, a função OBJECT_ID (). Eu configurei um exemplo mínimo no 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
Agora eu posso usar OBJECT_ID () para verificar se a tabela TEST existe desta maneira:
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. |
Não importa se eu passar o identificador TEST com ou sem colchetes, o analisador é inteligente o suficiente para removê-los.
Bem, eu posso simular isso adicionando uma função escalar que remove colchetes de uma string:
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
E então use-o desta maneira:
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
Mas minha pergunta é:
- Existe alguma função interna oculta que remove os colchetes usando o T-SQL?
dbfiddle aqui
fonte
[
e]
e substituir qualquer]]
com]
Quando colchetes são necessários , é porque seu identificador já é uma palavra-chave reservada. Usá-los arbitrariamente não só não é necessário, mas também gera muita confusão, como você pode ver.
Na minha opinião, a melhor maneira é evitar o uso de identificadores reservados em primeiro lugar.
fonte