À quoi sert le type de données SQL Server SYSNAME? BOL dit:
Le type de données sysname est utilisé pour les colonnes de table, les variables et les paramètres de procédure stockée qui stockent les noms d'objet.
mais je ne comprends pas vraiment ça. Y a-t-il un cas d'utilisation que vous pouvez fournir?
sql
sql-server
tsql
types
jrara
la source
la source
Réponses:
sysname
est un type de données intégré limité à 128 caractères Unicode qui, IIRC, est principalement utilisé pour stocker les noms d'objets lors de la création de scripts. Sa valeur ne peut pas êtreNULL
C'est fondamentalement la même chose que d'utiliser
nvarchar(128) NOT NULL
ÉDITER
Comme mentionné par @Jim dans les commentaires, je ne pense pas qu'il existe vraiment une analyse de rentabilisation que vous utiliseriez
sysname
pour être honnête. Il est principalement utilisé par Microsoft lors de la création dessys
tables internes et des procédures stockées, etc. dans SQL Server.Par exemple, en exécutant,
Exec sp_help 'sys.tables'
vous verrez que la colonnename
est définie commesysname
ceci parce que la valeur de ceci est en fait un objet en soi (une table)Je m'en inquiéterais trop.
Il convient également de noter que pour les personnes qui utilisent encore SQL Server 6.5 et versions antérieures (y a-t-il encore des personnes qui l'utilisent?), Le type intégré
sysname
devarchar(30)
Documentation
sysname
est défini avec la documentation pournchar
etnvarchar
, dans la section remarques:Pour clarifier les remarques ci-dessus, par défaut sysname est défini car
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
Vous trouverez de plus amples informations sur l'
sysname
autorisation ou l'interdiction desNULL
valeurs ici https://stackoverflow.com/a/52290792/300863Ce n'est pas parce que c'est la valeur par défaut (être NOT NULL) que cela ne garantit pas qu'il le sera!
la source
sysname
pour la compatibilité ascendante (et descendante) dans vos scripts.nvarchar(max)
non nulles dans le SP mais elles s'affichent sous forme de asysname
dans les tables sys.sys.types
c'est unnvarchar(256) not null
. Notez que l'ID de type de système = 231 (nvarchar). Il fonctionne comme un alias de type dans TDS de nos jours; le premier ID d'un alias est 256, ce qui correspond àsysname
. Quant à l'usage:sysname
est utilisé dans les schémas d'information.Si jamais vous avez besoin de créer un SQL dynamique, il convient de l'utiliser
sysname
comme type de données pour les variables contenant les noms de table, les noms de colonne et les noms de serveur.la source
Tout comme un FYI ...
select * from sys.types where system_type_id = 231
vous donne deux lignes.(Je ne sais pas encore ce que cela signifie, mais je suis sûr à 100% que cela gâche mon code en ce moment)
edit: je suppose que ce que cela signifie est que vous devez rejoindre par le user_type_id dans cette situation (ma situation) ou peut-être à la fois le user_type_id et l'esystem_type_id
Cette requête:
donne:
et ça:
vous donne ceci:
la source
sys.types
contient également les types définis par l' utilisateur que vous créez. Si vous le faites,create type MyInt from int
vous aurez deux lignes avecsystem_type_id = 56
. Un autre qui est dupliqué par défaut est 240, qui est le type de système pour hierarchyid, geometry et geography.where typ.name<>'sysname'
ou est-ce que cela aurait une autre sorte de conséquence dont je ne suis pas conscient?Permettez-moi de lister un cas d'utilisation ci-dessous. J'espère que ça aide. 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 SQL dynamique qui nécessite des variables contenant des noms de table, des noms de colonnes et des noms de serveurs. Je viens de penser à fournir un exemple simple pour compléter son propos.
la source
sysname
est utilisé parsp_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.Selon Microsoft ,
la source
FWIW, vous pouvez passer un nom de table aux SP système utiles comme celui-ci, si vous souhaitez explorer une base de données de cette façon:
la source
Un autre cas d'utilisation est l'utilisation de la fonctionnalité SQL Server 2016+ de
AT TIME ZONE
L'instruction ci-dessous renverra une date convertie en GMT
Si vous voulez passer le fuseau horaire en tant que variable, dites:
alors cette variable doit être du type
sysname
(la déclarer commevarchar
provoquant une erreur).la source
Partout où vous souhaitez stocker un nom d'objet à utiliser par les scripts de maintenance de base de données. Par exemple, un script purge les anciennes lignes de certaines tables qui ont une colonne de date. Il est configuré avec une table qui donne le nom de la table, le nom de la colonne sur laquelle filtrer et le nombre de jours d'historique à conserver. Un autre script vide certaines tables dans des fichiers CSV et est à nouveau configuré avec une table répertoriant les tables à vider. Ces tables de configuration peuvent utiliser le
sysname
type pour stocker les noms de table et de colonne.la source
nvarchar(128) not null
colonne. Le nom est juste ça, un nom. Il ne doit passysname
être utilisénvarchar(300)
cela fonctionnerait aussi ou mêmevarchar
si vous n'utilisez pas Unicode dans les noms de table (comme je suis sûr que presque personne ne le fait). L'avantage desysname
est en partie qu'il rend l'intention plus claire: cette colonne contient un nom d'objet; et en partie que même si vous migrez vers une version différente de MSSQL qui change le type de données utilisé pour les noms d'objet (comme cela s'est produit auparavant), il continuera à être le bon type.nvarchar(128) NOT NULL
. En fait, c'est ainsi que vous pouvez trouver le type - en vérifiant lauser_type_id
valeur de la colonne. Vous ne gagnez rien de plus en utilisant ce type que vous ne le feriez en créant votre propre type d'utilisateursysname
était modifiée dans une version plus récente de MSSQL et que la base de données était sauvegardée et restaurée dans cette nouvelle instance, toutes les colonnes qui étaient auparavantsysname
seraient désormais du mauvais type et ne correspondraient plus au type utilisé dans les tables système?sysname
est un type défini par l'utilisateur avecusert_type_id
256. Il n'y a pasALTER TYPE
donc il n'y a aucun moyen de le changer. Vous devrez créer un nouveau type et remplacer toutes les colonnes qui utilisaient l'ancien type par le nouveau. Si MS décidait de changer cela, ils devraient migrer les données de table système existantes vers le nouveau type. Vous pouvez vous attendre à ce qu'ils le fassent pour les tables système qu'ils connaissent déjà, mais toutes les tables utilisateur devront être migrées par les utilisateurs