Meine gespeicherte Prozedur darf eine beliebige Zeichenfolge @String
als varchar
oder mit maximal 128 Zeichen Länge übergeben werden.Überprüfen, ob ein vorgeschlagener T-SQL-Objektname gültig ist oder in eckige Klammern eingeschlossen werden muss
Die gespeicherte Prozedur muss den Wert @String
als Objektnamen verwenden, d. H. Den Namen einer Tabelle, eines Felds, einer Sicht oder ähnlichem.
Wie kann ich feststellen, ob der angegebene Wert @String
ein gültiger Objektname ist - dh kein reserviertes Wort ist und keine ungültigen Zeichen enthält - oder wenn es ein Gehäuse innerhalb benötigt (und jegliches Entkommen) eckige Klammern um machen es ein gültiger Objektname.
Zum Beispiel, "X", "Foo" und "C: \ Temp \ X.csv" sind gültige Objektnamen (ja, ich habe erfolgreich "C: \ Temp \ X.csv" wie sie ist verwendet) und kann unmodifiziert verwendet werden, während "Select", "AB] C" und "1_ABC" nicht gültig sind und in "[Select]", "[AB]] C" und "[1_ABC ] "
Ich würde eine Lösung bevorzugen, die nicht einfach versucht, ein Objekt mit diesem Namen zu erstellen und dann überprüft, ob es funktioniert hat.
Bevorzugt werden Antworten, die über eine größere Anzahl von SQL Server-Versionen als nur die neueste Version anwendbar sind, und kürzerer, weniger komplexer Code wird gegenüber längerem, komplexeren Code bevorzugt.
Als ein Beispiel für das Problem, das mich dazu gebracht, diese Frage zu stellen, kann meine SP @Name
geben werden, die „C: \ Temp \ X.csv“ sein könnten oder „ABC“ oder „SELECT“ oder was auch immer. Mein SP erstellt dann eine Tabelle, füllt sie und dann (so dass ich nicht dynamisches SQL verwenden muss) ändert ihren Namen zu @Name mit sp_rename
. Ich brauche QUOTENAME(@Name)
wo @Name = "SELECT", aber nicht in den anderen beiden Fällen, (in den SSMS Object Explorer) Tabellen "dbo.C: \ Temp \ X.csv", "dbo.ABC" und "dbo .WÄHLEN". Ich muss auch überprüfen, ob diese Objekte vorhanden sind, bevor ich den Rest des SP ausführe, und wenn ich QUOTENAME
"C: \ Temp \ X.csv", bevor ich es als der neue Name an sp_rename
übergeben, erscheint es in der SSMS-Objekt-Explorer als "dbo. [C: \ Temp \ X.csv]", und ich muss IF OBJECT_ID('[[C:\Temp\X.csv]]]') IS NOT NULL
verwenden, um erfolgreich festzustellen, dass es existiert, nichtIF OBJECT_ID('[C:\Temp\X.csv]') IS NOT NULL
.
Warum sich Sorgen machen, ob * es * beigefügt werden muss, wenn Sie es einfach an 'QUOTENAME' übergeben können und mit dem Rest Ihrer Arbeit fortfahren. Sicher, manchmal hat es * unnötige * Klammern hinzugefügt, aber ist das wirklich ein Problem? –
@Damien_The_Unbeliever, ja, wenn ich 'QUOTENAME'" C: \ Temp \ X.csv "bekomme ich" [C: \ Temp \ X.csv] ", aber ich muss * beziehen * auf" [[C: \ Temp \ X.csv]]] um * das * resultierende Objekt zu verwenden. Wenn ich es nicht "QUOTENAME", kann ich * verweisen * als "[C: \ Temp \ X.csv]" oder "C: \ Temp \ X.csv". –
Eh? Ich bin nicht sicher, was Sie meinen, indem Sie in Ihrem Kommentar verweisen/verwenden - sobald Sie den Namen zitiert haben, ist das ein Name, den Sie für den Rest Ihres Codes verwenden können. Sie müssen den Wert nicht erneut codieren. Vielleicht, wenn Sie ein kurzes Beispiel Ihrer Verwendung hinzufügen könnten? –