soportados - ¿Qué caracteres son válidos en un nombre de base de datos de SQL Server?
tipos de datos sql server 2012 pdf (4)
Vamos a proporcionar a nuestros clientes una herramienta que (entre otras cosas) crea una nueva base de datos de SQL Server, y quiero poder hacer una validación básica del nombre de la base de datos que proporcionan. La documentación de SQL Server explica qué caracteres son válidos en un nombre de base de datos. Sin embargo, la documentación es aparentemente incorrecta, porque puedo crear bases de datos cuyos nombres infringen las reglas documentadas.
De acuerdo con la documentación de SQL Server para CREATE DATABASE , los nombres de las bases de datos deben cumplir con las reglas para los identificadores; y las reglas para los identifiers dependen del nivel de compatibilidad de la base de datos. Cuando el nivel de compatibilidad es 100 (que, de acuerdo con SQL Server Management Studio, significa "SQL Server 2008"), el nombre debe comenzar con una letra Unicode, _
, @
o #
; seguido de una o más letras, números, @
, $
, #
o _
. La documentación establece claramente que los espacios incrustados o los caracteres especiales no están permitidos.
Esto va en contra de la evidencia disponible, porque puedo usar SQL Server Management Studio para crear una base de datos cuyo nombre es This & That | "Other"
This & That | "Other"
- que no solo contiene espacios incrustados (explícitamente prohibido), sino que contiene caracteres especiales ( |
, "
) que ni siquiera son válidos en un nombre de archivo. Lo comprobé, y el nivel de compatibilidad de la base de datos es de hecho" SQL Server 2008 ( 100) ", aunque su nombre está documentado como inválido en ese nivel de compatibilidad.
Diablos, incluso puedo CREATE DATABASE " "
(sí, es un espacio único), lo que demuestra que el primer personaje no tiene que ser una letra, un guión bajo, un signo o un signo de libra.
Así que supongo que mi pregunta es, ¿qué caracteres son válidos en un nombre de base de datos de SQL Server? ¿Existen reglas documentadas que sean consistentes con el comportamiento real de SQL Server?
Existe una diferencia entre los identificadores regulares y los identificadores delimitados. Un identificador regular está sujeto a las limitaciones que usted menciona, mientras que un identificador delimitado puede contener cualquier carácter (excepto el delimitador).
Como está usando comillas alrededor del identificador, es un identificador delimitado y no está limitado por las reglas de los identificadores regulares.
Sin los delimitadores, solo puede crear bases de datos con identificadores que sigan las reglas de los identificadores regulares:
create database db_name
Con los delimitadores, puedes usar casi cualquier cosa:
create database "That''s a funny name, isn''t it?"
create database [)(/%Q)/#&%¤)Q/#)!]
Las identifiers indican al final:
Cuando los identificadores se utilizan en las instrucciones de Transact-SQL, los identificadores que no cumplen con estas reglas deben estar delimitados por comillas dobles o corchetes.
Al elegir un nombre de base de datos que no se ajuste a esas reglas, debe encerrarlo siempre entre comillas dobles o corchetes.
Si se respetan las reglas para los identificadores regulares, puede usar el nombre de su base de datos sin comillas / corchetes.
Las siguientes instrucciones están bien
CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]
pero no
CREATE DATABASE This & That | "Other"
EDITAR:
Estoy de acuerdo en que así no es como se entendería la documentación vinculada: ¿qué significa cumplir con las reglas para los identificadores si las reglas ya no se aplican tan pronto como se adjunta el identificador? El punto de incluir identificadores no conformes debe ser parte de las reglas.
Los nombres delimitados, rodeados de corchetes o comillas dobles (si QUOTED_IDENTIFIER está establecido en ON), pueden contener básicamente cualquier cosa que no sean los delimitadores. Incluso es posible usar los delimitadores dentro del nombre con alguna lógica de escape. Sin embargo, tenga en cuenta que solo se debe escapar el carácter de escape de cierre. En el primer ejemplo a continuación, la única instancia del carácter de escape de apertura en el nombre no necesita ser escapada, mientras que el carácter de escape de cierre debe ser escapado (reemplazando la instancia única con dos). Supongo que la lógica aquí es que cualquier código que esté analizando estas declaraciones está buscando un carácter de escape de cierre y no está interesado en los caracteres de escape de apertura anidados.
- [Prueba [Prueba] -> Prueba [Prueba
- [Prueba]] Prueba] -> Prueba] Prueba
La siguiente es una descripción de las reglas que rodean a los nombres de identificadores no delimitados (no incluidos) en SQL Server 2012. Es un extracto del documento Guía para migrar de MySQL a SQL Server 2012 .
Nombres de objeto de esquema
En SQL Server 2012, un nombre de objeto puede tener hasta 128 caracteres.
Los nombres de los identificadores no incluidos deben seguir estas reglas:
- El primer carácter debe ser alfanumérico, un guión bajo (_), un signo en (@) o un signo de número (#).
- Los caracteres subsiguientes pueden incluir caracteres alfanuméricos, un carácter de subrayado, un signo de (@), un signo de número o un signo de dólar.
- El identificador no debe ser una palabra reservada de Transact-SQL. Guía para migrar de MySQL a SQL Server 2012 8
- Los espacios incrustados o los caracteres especiales no están permitidos.
Los identificadores que comienzan con @ o un signo numérico tienen significados especiales. Los identificadores que comienzan con @ son nombres de variables locales. Aquellos que comienzan con un signo de número son nombres de tablas temporales.
Para citar un nombre de identificador en Transact-SQL, debe usar corchetes ([]).
Personalmente, los limitaría al alfabeto y a los números, y nada más (bueno, posiblemente también un _). Sin espacios, sin símbolos divertidos, sin retorno de carro, etc. Esto es lo más seguro que puede hacer.