Parfois, je stocke des noms d'objets (identificateurs) dans certaines de nos bases de données, par exemple dans certaines tables de paramètres. Étant donné que je sélectionne les enregistrements de ces tables à l'aide des opérateurs de comparaison «=» ou «LIKE», je dois prendre soin de stocker ces noms toujours avec ou sans crochets .
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
ou
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
Cependant, MS-SQL a certaines fonctions où vous pouvez utiliser des noms d'objet avec ou sans crochets, par exemple la fonction OBJECT_ID (). J'ai mis en place un exemple minimal sur 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
Maintenant, je peux utiliser OBJECT_ID () pour vérifier si la table TEST existe de cette façon:
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. |
Peu importe que je passe l'identifiant TEST avec ou sans crochets, l'analyseur est assez intelligent pour supprimer les crochets.
Eh bien, je peux simuler cela en ajoutant une fonction scalaire qui supprime les crochets d'une chaîne:
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
Et puis utilisez-le de cette manière:
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
Mais ma question est:
- Existe-t-il une fonction intégrée cachée qui supprime les crochets à l'aide de T-SQL?
dbfiddle ici
la source
[
et]
et remplacer tout]]
avec]
Lorsque des crochets sont nécessaires - c'est parce que votre identifiant est déjà un mot-clé réservé. Les utiliser de façon arbitraire n'est pas seulement non nécessaire, cela conduit à beaucoup de confusion comme vous pouvez le voir.
À mon avis, la meilleure façon est d'éviter en premier lieu d'utiliser des identifiants réservés.
la source