¿Para qué es el tipo de datos SYSNAME de SQL Server? BOL dice:
El tipo de datos sysname se usa para columnas de tabla, variables y parámetros de procedimientos almacenados que almacenan nombres de objetos.
pero realmente no entiendo eso. ¿Hay un caso de uso que pueda proporcionar?
sql
sql-server
tsql
types
jrara
fuente
fuente
Respuestas:
sysname
es un tipo de datos integrado limitado a 128 caracteres Unicode que, IIRC, se usa principalmente para almacenar nombres de objetos al crear scripts. Su valor no puede serNULL
Básicamente es lo mismo que usar
nvarchar(128) NOT NULL
EDITAR
Como mencionó @Jim en los comentarios, no creo que haya realmente un caso de negocios en el que
sysname
pueda ser sincero. Microsoft lo utiliza principalmente al crearsys
tablas internas y procedimientos almacenados, etc. en SQL Server.Por ejemplo, al ejecutar
Exec sp_help 'sys.tables'
, verá que la columnaname
se define comosysname
esto porque el valor de esto es en realidad un objeto en sí mismo (una tabla)Me preocuparía demasiado por eso.
También vale la pena señalar que para aquellas personas que todavía usan SQL Server 6.5 y versiones anteriores (¿todavía hay personas que lo usan?), El tipo incorporado
sysname
es el equivalente devarchar(30)
Documentación
sysname
se define con la documentación paranchar
ynvarchar
, en la sección de comentarios:Para aclarar los comentarios anteriores, por defecto se define sysname ya
NOT NULL
que ciertamente es posible definirlo como anulable. También es importante tener en cuenta que la definición exacta puede variar entre instancias de SQL Server.Usar tipos de datos especiales
Puede encontrar más información sobre
sysname
permitir o rechazarNULL
valores aquí https://stackoverflow.com/a/52290792/300863El hecho de que sea el valor predeterminado (para que NO sea NULL) no garantiza que lo sea.
fuente
sysname
para la compatibilidad hacia adelante (y hacia atrás) en tus scripts.nvarchar(max)
no nulas en el SP pero se muestran como asysname
en las tablas del sistema.sys.types
es anvarchar(256) not null
. Tenga en cuenta que el tipo de sistema ID = 231 (nvarchar). Funciona como un alias de tipo en TDS hoy en día; la primera ID de un alias es 256, que corresponde asysname
. En cuanto al uso:sysname
se utiliza en esquemas de información.Si alguna vez tiene la necesidad de crear algún sql dinámico , es apropiado usarlo
sysname
como tipo de datos para variables que contienen nombres de tablas, columnas y servidores.fuente
Solo como un FYI ...
select * from sys.types where system_type_id = 231
te da dos filas(No estoy seguro de lo que esto significa todavía, pero estoy 100% seguro de que está desordenando mi código en este momento)
editar: supongo que lo que significa es que debes unirte por user_type_id en esta situación (mi situación) o posiblemente tanto user_type_id como th esystem_type_id
Esta consulta:
rendimientos:
y esto:
te da esto:
fuente
sys.types
contiene los tipos definidos por el usuario que usted crea también. Si lo hacescreate type MyInt from int
, tendrás dos filas consystem_type_id = 56
. Otro que está duplicado por defecto es 240, que es el tipo de sistema para jerarquía, geometría y geografía.where typ.name<>'sysname'
o tendría algún otro tipo de consecuencia que desconozco?Permítanme enumerar un caso de uso a continuación. Espero eso ayude. Aquí estoy tratando de encontrar el propietario de la tabla 'Stud_dtls' de la base de datos 'Estudiantes'. Como mencionó Mikael, sysname podría usarse cuando sea necesario crear algunos sql dinámicos que necesiten variables que contengan nombres de tablas, columnas y servidores. Solo pensé en proporcionar un ejemplo simple para complementar su punto.
fuente
sysname
es utilizado porsp_send_dbmail
un procedimiento almacenado que "envía un mensaje de correo electrónico a los destinatarios especificados" y ubicado en la base de datos msdb.De acuerdo con Microsoft ,
fuente
FWIW, puede pasar un nombre de tabla a SP del sistema útiles como este, si desea explorar una base de datos de esa manera:
fuente
Otro caso de uso es cuando se usa la funcionalidad SQL Server 2016+ de
AT TIME ZONE
La siguiente declaración devolverá una fecha convertida a GMT
Si desea pasar la zona horaria como una variable, diga:
entonces esa variable debe ser del tipo
sysname
(declararla comovarchar
causará un error).fuente
En cualquier lugar donde desee almacenar un nombre de objeto para que lo utilicen los scripts de mantenimiento de la base de datos. Por ejemplo, un script purga las filas antiguas de ciertas tablas que tienen una columna de fecha. Está configurado con una tabla que proporciona el nombre de la tabla, el nombre de la columna para filtrar y cuántos días de historial guardar. Otro script volca ciertas tablas en archivos CSV, y nuevamente se configura con una tabla que enumera las tablas para volcar. Estas tablas de configuración pueden usar el
sysname
tipo para almacenar nombres de tablas y columnas.fuente
nvarchar(128) not null
columna. El nombre es solo eso, un nombre. No tiene que sersysname
usadonvarchar(300)
también funcionaría o inclusovarchar
si no usa Unicode en los nombres de las tablas (como estoy seguro de que casi nadie lo hace). La ventaja desysname
es en parte que aclara la intención: esta columna contiene un nombre de objeto; y, en parte, que incluso si migra a una versión diferente de MSSQL que cambia el tipo de datos utilizado para los nombres de objetos (como ha sucedido antes), seguirá siendo el tipo correcto.nvarchar(128) NOT NULL
. De hecho, así es como puede encontrar el tipo, verificando eluser_type_id
valor de la columna. Al ganar ese tipo, no gana nada más de lo que ganaría al crear su propio tipo de usuariosysname
se cambiara en una versión más reciente de MSSQL, y la base de datos fuera respaldada y restaurada en esa instancia más nueva, todas las columnas que habían sido anteriormentesysname
ahora serían del tipo incorrecto y ya no coincidirían con el tipo usado en las tablas del sistema?sysname
es un tipo definido por el usuario conusert_type_id
256. No hay,ALTER TYPE
así que no hay forma de cambiarlo. Tendría que crear un nuevo tipo y cambiar todas las columnas que usaban el tipo antiguo por el nuevo. Si MS alguna vez decidiera cambiar esto , tendrían que migrar los datos de la tabla del sistema existente al nuevo tipo. Puede esperar que hagan esto para las tablas del sistema que ya conocen, pero cualquier tabla de usuario tendría que ser migrada por los usuarios