Что такое тип данных SYSNAME в SQL Server?
Для чего используется тип данных SQL Server SYSNAME? BOL говорит:
Тип данных sysname используется для столбцы таблицы, переменные и сохраненные параметры процедуры, которые хранят объект имена.
но на самом деле я этого не понимаю. Есть ли прецедент, который вы можете предоставить?
Ответы
Ответ 1
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).
Ответ 2
Есть ли вариант использования, который вы можете предоставить?
Если вам когда-либо понадобится создать dynamic sql, целесообразно использовать sysname
как тип данных для переменных, содержащих имена таблиц, имена столбцов и имена серверов.
Ответ 3
Так же, как 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
Ответ 4
Позвольте мне привести пример использования ниже. Надеюсь, поможет. Здесь я пытаюсь найти владельца таблицы таблицы "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
Ответ 5
FWIW, вы можете передать имя таблицы в полезный системный SP, как это, если вы хотите изучить базу данных следующим образом:
DECLARE @Table sysname; SET @Table = 'TableName';
EXEC sp_fkeys @Table;
EXEC sp_help @Table;
Ответ 6
sysname
используется sp_send_dbmail
, хранимой процедурой, которая "отправляет сообщение электронной почты указанным получателям" и находится в базе данных msdb.
По словам Microsoft,
[ @profile_name = ] 'profile_name'
Имя профиля для отправки сообщения. Имя_профиля имеет тип sysname со значением по умолчанию NULL. Имя_профиля должно быть именем существующего профиля Database Mail. Если имя_профиля не указано, sp_send_dbmail использует личный профиль по умолчанию для текущего пользователя. Если у пользователя нет личного профиля по умолчанию, sp_send_dbmail использует общедоступный профиль по умолчанию для базы данных msdb. Если у пользователя нет личного профиля по умолчанию и нет общедоступного профиля по умолчанию для базы данных, необходимо указать @profile_name.
Ответ 7
Другой вариант использования - это использование функциональности 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
приведет к ошибке).