Saltar al contenido

¿Qué es el tipo de datos SYSNAME en SQL Server?

Jaime, parte de este equipo, nos hizo el favor de crear este enunciado ya que conoce perfectamente el tema.

Solución:

sysname es un tipo de datos integrado limitado a 128 caracteres Unicode que, IIRC, se utiliza principalmente para almacenar nombres de objetos al crear scripts. Su valor no puede ser NULL

Básicamente es lo mismo que usar nvarchar(128) NOT NULL

EDITAR

Como lo mencionó @Jim en los comentarios, no creo que exista realmente un caso comercial en el que usaría sysname para ser sincero. Microsoft lo utiliza principalmente al crear el sys tablas y procedimientos almacenados, etc.dentro de SQL Server.

Por ejemplo, ejecutando Exec sp_help 'sys.tables' verás que la columna name Se define como sysname esto se debe a que 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 integrado de sysname es el equivalente de varchar(30)

Documentación

sysname se define con la documentación para nchar y nvarchar, en la sección de comentarios:

sysname es un tipo de datos definido por el usuario proporcionado por el sistema que es funcionalmente equivalente a nvarchar (128), excepto que no admite nulos. sysname se utiliza para hacer referencia a los nombres de los objetos de la base de datos.

Para aclarar las observaciones anteriores, defectosysname Se define como NOT NULL 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.

Uso de tipos de datos especiales

los sysname El tipo de datos se utiliza para columnas de tabla, variables y parámetros de procedimiento almacenado que almacenan nombres de objeto. La definición exacta de
sysname está relacionado con las reglas para identificadores. Por lo tanto, puede variar entre instancias de SQL Server. sysname es funcionalmente igual que nvarchar (128) excepto que, por defecto, sysname No es nulo. En versiones anteriores de SQL Server, sysname se define como varchar (30).

Más información sobre sysname permitir o rechazar NULL Los valores se pueden encontrar aquí https://stackoverflow.com/a/52290792/300863

¡El hecho de que sea el valor predeterminado (NOT NULL) no garantiza que lo sea!

¿Hay un caso de uso que pueda proporcionar?

Si alguna vez tiene la necesidad de crear un SQL dinámico, es apropiado usar sysname como tipo de datos para variables que contienen nombres de tablas, nombres de columnas y nombres de servidores.

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á arruinando mi código en este momento)

editar: Supongo que lo que significa es que debe unirse por el user_type_id en esta situación (mi situación) o posiblemente tanto el user_type_id como el system_type_id

name        system_type_id   user_type_id   schema_id   principal_id    max_length  precision   scale   collation_name                  is_nullable     is_user_defined     is_assembly_type    default_object_id   rule_object_id
nvarchar    231              231            4           NULL            8000        0           0       SQL_Latin1_General_CP1_CI_AS    1               0                   0                   0                   0
sysname     231              256            4           NULL            256         0           0       SQL_Latin1_General_CP1_CI_AS    0               0                   0                   0                   0

create procedure dbo.yyy_test (
    @col_one    nvarchar(max),
    @col_two    nvarchar(max)  = 'default',
    @col_three  nvarchar(1),
    @col_four   nvarchar(1)    = 'default',
    @col_five   nvarchar(128),
    @col_six    nvarchar(128)  = 'default',
    @col_seven  sysname  
)
as begin 

    select 1
end 

Esta consulta:

select  parm.name AS Parameter,    
        parm.max_length, 
        parm.parameter_id 
         
from    sys.procedures sp

        join sys.parameters parm ON sp.object_id = parm.object_id 
        
where   sp.name = 'yyy_test'

order   by parm.parameter_id

Rendimientos:

parameter           max_length  parameter_id
@col_one            -1          1
@col_two            -1          2
@col_three           2          3
@col_four            2          4
@col_five            256        5
@col_six             256        6
@col_seven           256        7

Y esto:

select  parm.name as parameter,    
        parm.max_length, 
        parm.parameter_id,
        typ.name as data_type, 
        typ.system_type_id, 
        typ.user_type_id,
        typ.collation_name,
        typ.is_nullable 
from    sys.procedures sp

        join sys.parameters parm ON sp.object_id = parm.object_id
        
        join sys.types typ ON parm.system_type_id = typ.system_type_id
        
where   sp.name = 'yyy_test'

order   by parm.parameter_id

Te da esto:

parameter   max_length  parameter_id    data_type   system_type_id  user_type_id    collation_name                  is_nullable
@col_one    -1          1               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_one    -1          1               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_two    -1          2               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_two    -1          2               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_three   2          3               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_three   2          3               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_four    2          4               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_four    2          4               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_five    256        5               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_five    256        5               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_six     256        6               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_six     256        6               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_seven   256        7               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_seven   256        7               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0

Comentarios y calificaciones

Agradecemos que desees animar nuestra ocupación mostrando un comentario y dejando una puntuación te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *