Что такое тип данных SYSNAME в SQL Server?

Для чего используется тип данных SQL Server SYSNAME? BOL говорит:

Тип данных sysname используется для столбцы таблицы, переменные и сохраненные параметры процедуры, которые хранят объект имена.

но на самом деле я этого не понимаю. Есть ли прецедент, который вы можете предоставить?

4b9b3361

sysname - это встроенный тип данных, ограниченный 128 символами Unicode, которые IIRC используются, прежде всего, для хранения имен объектов при создании сценариев. Его значение не может быть NULL

Это в основном то же самое, что использовать nvarchar(128) NOT NULL

ИЗМЕНИТЬ

Как упоминалось в комментариях @Jim, я не думаю, что действительно есть бизнес-пример, где вы бы использовали sysname, чтобы быть честным. Он в основном используется Microsoft при построении внутренних таблиц sys и хранимых процедур и т.д. В SQL Server.

Например, выполнив Exec sp_help 'sys.tables', вы увидите, что столбец name определяется как sysname, потому что значение этого на самом деле является само по себе (таблица)

Я бы слишком беспокоился об этом.

Также стоит отметить, что для тех людей, которые все еще используют SQL Server 6.5 и ниже (есть ли все еще люди, использующие его?) встроенный тип sysname эквивалентен varchar(30)

Documentation

sysname определяется документацией для nchar и nvarchar в разделе замечаний:

sysname представляет собой системный пользовательский тип данных, функционально эквивалентный nvarchar (128), за исключением того, что он не может быть недействителен. sysname используется для ссылки на имена объектов базы данных.

Чтобы прояснить приведенные выше замечания, по умолчанию sysname определяется как NOT NULL, его можно определить как значение NULL. Также важно отметить, что точное определение может различаться между экземплярами SQL Server.

Использование специальных типов данных

Тип данных sysname используется для столбцов таблицы, переменных и сохраненных параметры процедуры, которые хранят имена объектов. Точное определение sysname связано с правилами для идентификаторов. Поэтому он может различаются между экземплярами SQL Server. sysname функционально одинаково как nvarchar (128), за исключением того, что по умолчанию sysname не является NULL. В более ранние версии SQL Server, sysname определяется как varchar (30).

92
ответ дан 19 апр. '11 в 20:27
источник

Есть ли вариант использования, который вы можете предоставить?

Если вам когда-либо понадобится создать dynamic sql, целесообразно использовать sysname как тип данных для переменных, содержащих имена таблиц, имена столбцов и имена серверов.

42
ответ дан 19 апр. '11 в 23:52
источник

Позвольте мне привести пример использования ниже. Надеюсь, поможет. Здесь я пытаюсь найти владельца таблицы таблицы "Stud_dtls" из базы данных "Студенты". Как упоминал Микаэль, sysname может использоваться, когда есть необходимость в создании динамического sql, которому нужны переменные, содержащие имена таблиц, имена столбцов и имена серверов. Просто подумал о том, чтобы предоставить простой пример, чтобы дополнить его точку.

USE Students

DECLARE @TABLE_NAME sysname

SELECT @TABLE_NAME = 'Stud_dtls'

SELECT TABLE_SCHEMA 
  FROM INFORMATION_SCHEMA.Tables
 WHERE TABLE_NAME = @TABLE_NAME
2
ответ дан 14 янв. '14 в 11:00
источник

Так же, как FYI....

select * from sys.types where system_type_id = 231 дает вам две строки.

(я не уверен, что это значит, но я на 100% уверен, что он испортил мой код прямо сейчас)

edit: Я предполагаю, что это означает, что вы должны присоединиться к user_type_id в этой ситуации (моя ситуация) или, возможно, как user_type_id, так и th esystem_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 

Этот запрос:

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

дает:

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

и это:

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

дает вам следующее:

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
2
ответ дан 26 марта '13 в 19:30
источник

FWIW, вы можете передать имя таблицы в полезный системный SP, как это, если вы хотите изучить базу данных следующим образом:

DECLARE @Table sysname; SET @Table = 'TableName';
EXEC sp_fkeys @Table;
EXEC sp_help @Table;
1
ответ дан 31 июля '15 в 11:56
источник

sysname используется sp_send_dbmail, хранимой процедурой, которая "отправляет сообщение электронной почты указанным получателям" и находится в базе данных msdb.

Согласно Microsoft,

[ @profile_name = ] 'profile_name'

Is the name of the profile to send the message from. The profile_name is of type sysname, with a default of NULL. The profile_name must be the name of an existing Database Mail profile. When no profile_name is specified, sp_send_dbmail uses the default private profile for the current user. If the user does not have a default private profile, sp_send_dbmail uses the default public profile for the msdb database. If the user does not have a default private profile and there is no default public profile for the database, @profile_name must be specified.
0
ответ дан 07 янв. '16 в 20:34
источник