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.