Manchmal speichere ich Objektnamen (Bezeichner) in einigen unserer Datenbanken, zum Beispiel in einigen Parametertabellen. Da ich Datensätze aus diesen Tabellen mit den Vergleichsoperatoren '=' oder 'LIKE' auswähle, muss ich darauf achten, diese Namen immer mit oder ohne Klammern zu speichern .
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]';
oder
IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME';
MS-SQL verfügt jedoch über einige Funktionen, in denen Sie Objektnamen mit oder ohne Klammern verwenden können, z. B. die Funktion OBJECT_ID (). Ich habe ein minimales Beispiel auf dbfiddle.uk eingerichtet .
CREATE TABLE TEST
(
ID INT IDENTITY(1,1) PRIMARY KEY,
OBJECT sysname NOT NULL
);
GO
INSERT INTO TEST VALUES ('[obj1]'),('obj2'),('obj3'),('[obj4]');
GO
Jetzt kann ich mit OBJECT_ID () überprüfen, ob die Tabelle TEST auf folgende Weise vorhanden ist:
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. |
Es spielt keine Rolle, ob ich den Bezeichner-TEST mit oder ohne Klammern übergebe. Der Parser ist intelligent genug, um die Klammern zu entfernen.
Nun, ich kann dies simulieren, indem ich eine Skalarfunktion hinzufüge, die Klammern aus einer Zeichenfolge entfernt:
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
Und dann benutze es so:
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
Aber meine Frage ist:
- Gibt es eine versteckte integrierte Funktion, mit der Klammern mithilfe von T-SQL entfernt werden?
dbfiddle hier
quelle
[
und]
alle]]
durch]
Wenn eckige Klammern benötigt werden , liegt dies daran, dass Ihre Kennung bereits ein reserviertes Schlüsselwort ist. Eine willkürliche Verwendung ist nicht nur nicht erforderlich, sondern führt auch zu großer Verwirrung, wie Sie sehen können.
Meiner Meinung nach ist es am besten, reservierte Bezeichner überhaupt nicht zu verwenden.
quelle