Что такое тип данных SYSNAME в SQL Server? - PullRequest
108 голосов
/ 19 апреля 2011

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

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

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

Ответы [ 7 ]

125 голосов
/ 19 апреля 2011

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

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

EDIT

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

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

Я бы слишком переживал по этому поводу.

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

Документация

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

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

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

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

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

55 голосов
/ 20 апреля 2011

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

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

3 голосов
/ 14 января 2014

Позвольте мне перечислить пример использования ниже.Надеюсь, поможет.Здесь я пытаюсь найти владельца таблицы для таблицы «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
3 голосов
/ 26 марта 2013

Так же, как к вашему сведению ....

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
1 голос
/ 07 января 2016

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

Согласно Microsoft ,

[ @profile_name = ] 'profile_name'  

Имя профиля, с которого отправляется сообщение.Имя_профиля имеет тип sysname со значением по умолчанию NULL.Имя_профиля должно быть именем существующего профиля Database Mail.Если имя_профиля не указано, sp_send_dbmail использует личный профиль по умолчанию для текущего пользователя.Если у пользователя нет личного профиля по умолчанию, sp_send_dbmail использует общедоступный профиль по умолчанию для базы данных msdb.Если у пользователя нет личного профиля по умолчанию и нет общедоступного профиля по умолчанию для базы данных, необходимо указать @profile_name.

1 голос
/ 31 июля 2015

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

DECLARE @Table sysname; SET @Table = 'TableName';
EXEC sp_fkeys @Table;
EXEC sp_help @Table;
0 голосов
/ 09 апреля 2019

Другой вариант использования - при использовании функциональности SQL Server 2016+ AT TIME ZONE

Приведенный ниже оператор вернет дату, конвертированную в GMT

SELECT 
CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE 'GMT Standard Time')))

Если вы хотите передать часовой пояс как переменную, скажите:

SELECT 
CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE @TimeZone)))

тогда эта переменная должна иметь тип sysname (ее объявление varchar приведет к ошибке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...