Domanda Quali caratteri sono validi in un nome di database di SQL Server?


Forniremo ai nostri clienti uno strumento che (tra le altre cose) crea un nuovo database SQL Server e voglio essere in grado di fare una convalida di base sul nome del database che forniscono. La documentazione di SQL Server spiega quali caratteri sono validi nel nome di un database. Tuttavia, la documentazione è apparentemente errata, perché posso creare database con nomi che violano le regole documentate.

Secondo la documentazione di SQL Server per CREA DATABASE, i nomi dei database devono essere conformi alle regole per gli identificatori; e le regole per identificatori dipende dal livello di compatibilità del database. Quando il livello di compatibilità è 100 (che, secondo SQL Server Management Studio, significa "SQL Server 2008"), il nome deve iniziare con una lettera Unicode, _, @, o #; seguito da una o più lettere, numeri, @, $, #, o _. La documentazione indica chiaramente che non sono consentiti spazi incorporati o caratteri speciali.

Ciò sfugge alla prova disponibile, perché posso utilizzare SQL Server Management Studio per creare un database il cui nome è This & That | "Other" - che non solo contiene spazi incorporati (esplicitamente vietato), ma contiene caratteri speciali (|, ") che non sono nemmeno validi in un nome di file. Ho controllato, e il livello di compatibilità del database è effettivamente "SQL Server 2008 (100)", anche se il suo nome è documentato come non valido a quel livello di compatibilità.

Diamine, posso anche farlo CREATE DATABASE " " (sì, quello è un singolo spazio), il che dimostra che il primo personaggio lo fa non deve essere una lettera, un segno di sottolineatura, un segno o un cancelletto.

Quindi immagino che la mia domanda sia, quali personaggi siamo valido in un nome di database SQL Server? Esistono regole documentate coerenti con il comportamento effettivo di SQL Server?


46
2017-11-17 00:09


origine


risposte:


Il regole per gli identificatori stato alla fine:

Quando gli identificatori sono usati in   Istruzioni Transact-SQL, il   identificatori che non rispettano   queste regole devono essere delimitate da   doppie virgolette o parentesi.

Scegliendo un nome di database che non è conforme a tali regole, tu dovere racchiuderlo sempre con virgolette doppie o parentesi.

Se le regole per gli identificatori regolari sono rispettate, puoi usare il nome del tuo database senza virgolette / parentesi.

Le seguenti istruzioni sono ok

CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]

ma no

CREATE DATABASE This & That | "Other"

MODIFICARE:

Sono d'accordo sul fatto che questo non è il modo in cui si capirebbe la documentazione collegata: cosa fa deve rispettare le regole per gli identificatori significa se le regole non si applicano più appena l'identificatore è allegato? Il punto in cui inserire identificatori non conformi dovrebbe essere parte delle regole.


27
2017-11-17 00:33



C'è una differenza tra identificatori regolari e identificatori delimitati. Un identificatore regolare è vincolato alle limitazioni menzionate, mentre un identificatore delimitato può contenere qualsiasi carattere (eccetto il delimitatore).

Poiché stai usando le virgolette attorno all'identificatore, è un identificatore delimitato e non sei limitato dalle regole degli identificatori regolari.

Senza i delimitatori puoi solo creare database con identificatori che seguono le regole degli identificatori regolari:

create database db_name

Con i delimitatori, puoi usare praticamente qualsiasi cosa:

create database "That's a funny name, isn't it?"

create database [)(/%Q)/#&%¤)Q/#)!]

10
2017-11-17 00:40



Personalmente li limiterei all'alfabeto e ai numeri e nient'altro (beh probabilmente anche un _). Nessuno spazio, nessun simbolo divertente, nessun ritorno a capo ecc. Questo è il modo più sicuro che puoi fare.


6
2017-11-17 15:23



Nomi delimitati - circondati da parentesi quadre o doppi apici (se QUOTED_IDENTIFIER è impostato su ON) - può contenere sostanzialmente qualsiasi cosa diversa dai delimitatori stessi. È persino possibile utilizzare i delimitatori all'interno del nome con una logica di escape. Si noti però che è solo il carattere di escape di chiusura che deve essere sfuggito. Nel primo esempio di seguito, la singola istanza del carattere di escape di apertura nel nome non ha bisogno di essere preceduta da escape mentre il carattere di escape di chiusura deve essere scappato (sostituendo la singola istanza con due). Immagino che la logica qui sia che qualsiasi codice che sta analizzando queste istruzioni sta cercando un carattere di escape di chiusura e non è interessato ai caratteri di escape di apertura nidificati.

  • [Test [Test] -> Test [Test
  • [Test]] Test] -> Test] Test

Di seguito è riportata una descrizione delle regole relative ai nomi di identificatori non delimitati (non quotati) in SQL Server 2012. È un estratto dal documento Guida alla migrazione da MySQL a SQL Server 2012.

Nomi oggetto dello schema

In SQL Server 2012, il nome di un oggetto può contenere fino a 128 caratteri.

I nomi degli identificatori non quotati devono seguire queste regole:

  • Il primo carattere deve essere alfanumerico, un carattere di sottolineatura (_), un simbolo (@) o un segno numerico (#).
  • I caratteri successivi possono includere caratteri alfanumerici, un trattino basso, un segno (@), un segno numerico o un segno di dollaro.
  • L'identificativo non deve essere una parola riservata Transact-SQL. Guida alla migrazione da MySQL a SQL Server 2012 8
  • Non sono consentiti spazi incorporati o caratteri speciali.

Gli identificatori che iniziano con @ o un segno numerico hanno significati speciali.   Gli identificatori che iniziano con @ sono nomi di variabili locali. Quelli che iniziano   con un segno di numero sono nomi di tabelle temporanee.

Per citare un nome identificatore in Transact-SQL, devi usare quadrato   parentesi ([]).


2
2017-11-15 15:19