Para que serve o tipo de dados SYSNAME do SQL Server? BOL diz:
O tipo de dados sysname é usado para colunas da tabela, variáveis e parâmetros de procedimento armazenado que armazenam nomes de objetos.
mas eu realmente não entendo isso. Existe um caso de uso que você pode fornecer?
sql
sql-server
tsql
types
jrara
fonte
fonte
Respostas:
sysname
é um tipo de dados interno limitado a 128 caracteres Unicode que, IIRC, é usado principalmente para armazenar nomes de objetos ao criar scripts. Seu valor não pode serNULL
É basicamente o mesmo que usar
nvarchar(128) NOT NULL
EDITAR
Como mencionado por @Jim nos comentários, não acho que exista realmente um caso de negócios em que você usaria
sysname
para ser honesto. É usado principalmente pela Microsoft ao criarsys
tabelas internas e procedimentos armazenados, etc, no SQL Server.Por exemplo, ao executar,
Exec sp_help 'sys.tables'
você verá que a colunaname
está definida,sysname
pois o valor disso é na verdade um objeto em si (uma tabela)Eu me preocuparia muito com isso.
Também é importante notar que, para as pessoas que ainda usam o SQL Server 6.5 e inferior (ainda existem pessoas que o usam?), O tipo incorporado
sysname
é equivalente avarchar(30)
Documentação
sysname
é definido com a documentação paranchar
envarchar
, na seção de comentários:Para esclarecer as observações acima, por padrão sysname é definido,
NOT NULL
pois certamente é possível defini-lo como nulo. Também é importante observar que a definição exata pode variar entre instâncias do SQL Server.Usando tipos de dados especiais
Algumas informações adicionais sobre como
sysname
permitir ou nãoNULL
valores podem ser encontradas aqui https://stackoverflow.com/a/52290792/300863Só porque é o padrão (não ser NULL) não garante que será!
fonte
sysname
para compatibilidade direta (e reversa) em seus scripts.nvarchar(max)
não nulas no SP, mas estão sendo mostradas como asysname
nas tabelas sys.sys.types
é umnvarchar(256) not null
. Observe que o tipo de sistema ID = 231 (nvarchar). Ele funciona como um alias de tipo no TDS atualmente; o primeiro ID de um alias é 256, o que corresponde asysname
. Quanto ao uso:sysname
é usado no esquema de informações.Se você precisar criar algum sql dinâmico , é apropriado usá-lo
sysname
como tipo de dados para variáveis contendo nomes de tabelas, nomes de colunas e nomes de servidores.fonte
Assim como um FYI ....
select * from sys.types where system_type_id = 231
fornece duas linhas.(Ainda não tenho certeza do que isso significa, mas tenho 100% de certeza que está atrapalhando meu código)
edit: eu acho que o que isso significa é que você deve participar pelo user_type_id nesta situação (minha situação) ou possivelmente pelo user_type_id e pelo thesystem_type_id
Esta consulta:
rendimentos:
e isto:
dá a você o seguinte:
fonte
sys.types
mantém os tipos definidos pelo usuário que você cria também. Se vocêcreate type MyInt from int
tiver duas linhas comsystem_type_id = 56
. Outra duplicada por padrão é 240, que é o tipo de sistema para hierarchyid, geometry e geography.where typ.name<>'sysname'
ou isso teria algum outro tipo de consequência que eu não conheço?Deixe-me listar um caso de uso abaixo. Espero que ajude. Aqui estou tentando encontrar o proprietário da tabela 'Stud_dtls' no banco de dados 'Students'. Como Mikael mencionou, sysname pode ser usado quando houver necessidade de criar algum sql dinâmico que precise de variáveis contendo nomes de tabelas, nomes de colunas e nomes de servidores. Apenas pensei em fornecer um exemplo simples para complementar seu argumento.
fonte
sysname
é usado porsp_send_dbmail
, um procedimento armazenado que "Envia uma mensagem de email para os destinatários especificados" e localizado no banco de dados msdb.Segundo a Microsoft ,
fonte
FWIW, você pode passar um nome de tabela para SPs úteis do sistema como este, caso deseje explorar um banco de dados dessa maneira:
fonte
Outro caso de uso é ao usar a funcionalidade SQL Server 2016+ de
AT TIME ZONE
A declaração abaixo retornará uma data convertida para GMT
Se você deseja passar o fuso horário como uma variável, diga:
então essa variável precisa ser do tipo
sysname
(declarando-a comovarchar
causará um erro).fonte
Em qualquer lugar que você deseja armazenar um nome de objeto para uso pelos scripts de manutenção do banco de dados. Por exemplo, um script limpa linhas antigas de determinadas tabelas que possuem uma coluna de data. Ele é configurado com uma tabela que fornece o nome da tabela, o nome da coluna a ser filtrada e quantos dias de histórico manter. Outro script despeja determinadas tabelas em arquivos CSV e novamente é configurado com uma tabela listando as tabelas a serem despejadas. Essas tabelas de configuração podem usar o
sysname
tipo para armazenar nomes de tabelas e colunas.fonte
nvarchar(128) not null
coluna. O nome é apenas isso, um nome. Não precisasysname
ser usadonvarchar(300)
também funcionaria ou mesmovarchar
se você não usar Unicode em nomes de tabelas (como tenho certeza que quase ninguém o faz). A vantagem desysname
é parcialmente que torna a intenção mais clara: esta coluna contém um nome de objeto; e em parte, mesmo que você migre para uma versão diferente do MSSQL que altere o tipo de dados usado para nomes de objetos (como aconteceu antes), ele continuará sendo o tipo correto.nvarchar(128) NOT NULL
. De fato, é assim que você pode encontrar o tipo - verificando ouser_type_id
valor da coluna. Você não ganha nada mais usando esse tipo do que ganharia criando seu próprio tipo de usuáriosysname
fosse alterada em uma versão mais recente do MSSQL e o backup do banco de dados fosse restaurado nessa instância mais recente, todas as colunas que foram anteriormentesysname
agora seriam do tipo errado e não corresponderiam mais ao tipo usado nas tabelas do sistema?sysname
é um tipo definido pelo usuário comusert_type_id
256. Não existe,ALTER TYPE
portanto não há como alterá-lo. Você precisaria criar um novo tipo e alterar todas as colunas que usavam o tipo antigo para o novo. Se a MS decidisse mudar isso , teria que migrar os dados existentes da tabela do sistema para o novo tipo. Você pode esperar que eles façam isso nas tabelas de sistema que eles já conhecem, mas qualquer tabela de usuário teria que ser migrada pelos usuários