161 votes

Qu'est-ce que le type de données SYSNAME dans SQL Server ?

À quoi sert le type de données SYSNAME du serveur SQL ? BOL dit :

Le type de données sysname est utilisé pour colonnes de table, les variables et les paramètres de procédures stockées qui stockent d'objets.

mais je ne comprends pas vraiment. Pouvez-vous me donner un exemple d'utilisation ?

3 votes

En plus de ces belles réponses ci-dessous, il est également utilisé pour causer des ravages pour quelqu'un qui essaie d'obtenir des métadonnées de colonne en utilisant sys.types, car il partage le même system_type_id que nvarchar.

187voto

Barry Points 18913

sysname est un type de données intégré limité à 128 caractères Unicode qui, IIRC, est utilisé principalement pour stocker les noms d'objets lors de la création de scripts. Sa valeur ne peut pas être NULL

C'est essentiellement la même chose que d'utiliser nvarchar(128) NOT NULL

EDITAR

Comme mentionné par @Jim dans les commentaires, je ne pense pas qu'il y ait vraiment un cas d'entreprise où vous utiliseriez sysname pour être honnête. Il est principalement utilisé par Microsoft lors de la construction de l'interne sys les tables et les procédures stockées, etc. dans SQL Server.

Par exemple, en exécutant Exec sp_help 'sys.tables' vous verrez que la colonne name est défini comme suit sysname c'est parce que la valeur de this est en fait un objet en soi (un tableau)

Je ne m'inquiéterais pas trop à ce sujet.

Il convient également de noter que pour les personnes qui utilisent encore le serveur SQL 6.5 et les versions inférieures (existe-t-il encore des personnes qui l'utilisent ?), le type intégré d'interface utilisateur de SQL Server est le suivant sysname est l'équivalent de varchar(30)

Documentation

sysname est défini dans la documentation relative à l nchar y nvarchar dans la section des remarques :

nom de système est un type de données défini par l'utilisateur et fourni par le système qui est fonctionnellement équivalent à nvarchar(128) sauf qu'il n'est pas nullable. nom de système est utilisé pour référencer les noms des objets de la base de données.

Pour clarifier les remarques ci-dessus, en par défaut nom de système est défini comme suit NOT NULL il est certainement possible de le définir comme nullable. Il est également important de noter que la définition exacte peut varier entre les instances de SQL Server.

Utilisation de types de données spéciaux

El nom de système est utilisé pour les colonnes de table, les variables et les paramètres de procédure qui stockent des noms d'objets. La définition exacte de nom de système est liée aux règles relatives aux identificateurs. Par conséquent, il peut varier entre les instances de SQL Server. nom de système est fonctionnellement le même que nvarchar(128) sauf que, par défaut, nom de système est NOT NULL. Dans versions antérieures de SQL Server, nom de système est défini comme varchar(30).

Quelques informations supplémentaires sur sysname autoriser ou interdire NULL Les valeurs peuvent être trouvées ici https://stackoverflow.com/a/52290792/300863

Le fait que ce soit la valeur par défaut (être NOT NULL) ne garantit pas qu'il le sera !

1 votes

"Y a-t-il un cas d'utilisation que vous pouvez fournir ?" Je ne pense pas que vous trouverez une raison commerciale pratique pour l'utiliser. La plupart du temps, il est utilisé en interne dans MS SQL car il est probablement utilisé assez souvent dans les tables, etc.

12 votes

Vous utiliseriez sysname pour une compatibilité ascendante (et descendante) dans vos scripts.

0 votes

Je ne fais que mettre 2 centimes ici : les colonnes qui m'ont amené ici sont déclarées comme nvarchar(max) non nul dans le PS mais ils apparaissent comme une sysname dans les tables sys.

71voto

Mikael Eriksson Points 77190

Pouvez-vous fournir un cas d'utilisation ?

Si vous avez un jour besoin de créer des sql dynamique il est approprié d'utiliser sysname comme type de données pour les variables contenant des noms de tables, des noms de colonnes et des noms de serveurs.

8voto

gloomy.penguin Points 2391

Juste pour info, ....

select * from sys.types where system_type_id = 231 vous donne deux rangées.

(je ne suis pas encore sûr de ce que cela signifie mais je suis sûr à 100% que cela perturbe mon code en ce moment)

editar: Je suppose que cela signifie que vous devriez joindre par le user_type_id dans cette situation (ma situation) ou éventuellement par le user_type_id et le 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 

Cette requête :

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

Rendement :

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

Et ça :

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

Vous donne ça :

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

0 votes

sys.types détient le types définis par l'utilisateur que vous créez également. Si vous faites create type MyInt from int vous aurez deux rangées avec system_type_id = 56 . Un autre qui est dupliqué par défaut est le 240 qui est le type de système pour la hiérarchie, la géométrie et la géographie.

0 votes

J'ai complètement oublié ça. Alors... quelle est la manière idéale de faire une requête pour ce genre de choses avec le nom du système ? puisque c'est un 'alias', est-ce que je peux juste faire where typ.name<>'sysname' ou cela aurait-il d'autres conséquences dont je ne suis pas conscient ?

3 votes

Jointure avec sys.types sur system_type_id et user_type_id. Fiddle SQL

4voto

aok Points 11

Permettez-moi d'énumérer un cas d'utilisation ci-dessous. J'espère que cela vous aidera. Ici, j'essaie de trouver le propriétaire de la table 'Stud_dtls' de la base de données 'Students'. Comme Mikael l'a mentionné, sysname peut être utilisé lorsqu'il est nécessaire de créer un code SQL dynamique qui nécessite des variables contenant des noms de tables, des noms de colonnes et des noms de serveurs. J'ai juste pensé à fournir un exemple simple pour compléter son point de vue.

USE Students

DECLARE @TABLE_NAME sysname

SELECT @TABLE_NAME = 'Stud_dtls'

SELECT TABLE_SCHEMA 
  FROM INFORMATION_SCHEMA.Tables
 WHERE TABLE_NAME = @TABLE_NAME

2voto

usefulBee Points 492

sysname est utilisé par sp_send_dbmail Une procédure stockée qui "envoie un message électronique aux destinataires spécifiés" et située dans la base de données msdb.

Según Microsoft ,

[ @profile_name = ] 'profile_name'  

Est le nom du profil à partir duquel envoyer le message. Le nom_de_profil est de type sysname, avec une par défaut est NULL. Le nom_profil doit être le nom d'un profil existant de Database Mail existant. Si aucun nom de profil n'est spécifié, sp_send_dbmail utilise le profil privé par défaut pour l'utilisateur actuel. Si l'utilisateur n'a pas de profil privé par défaut, sp_send_dbmail utilise le profil public par défaut pour la base de données msdb. Si l'utilisateur n'a pas de profil privé par défaut et qu'il n'existe pas de profil public par public par défaut pour la base de données, @profile_name doit être spécifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X