Что такое тип данных SYSNAME в SQL Server?
для чего используется тип данных SQL Server SYSNAME? бол говорит:
тип данных sysname используется для
столбцы таблицы, переменные и сохраненные
параметры процедуры, хранящие объект
имена.
но я действительно не понимаю. Есть ли прецедент, который вы можете предоставить?
6 ответов:
sysname- это встроенный тип данных, ограниченный 128 символами Юникода, который, IIRC, используется в основном для хранения имен объектов при создании сценариев. Его значение не может бытьNULLэто в основном то же самое, что с помощью
nvarchar(128) NOT NULLEDIT
как упоминалось @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), за исключением того, что он не допускает значения null. sysname используется для ссылки на имена объектов базы данных.
чтобы прояснить вышеизложенные замечания, by по умолчаниюsysname определяется как
NOT NULLконечно, можно определить его как nullable. Также важно отметить, что точное определение может варьироваться между экземплярами SQL Server.Использование Специальных Типов Данных
The sysname тип данных используется для столбцов таблицы, переменных и хранится параметры процедуры хранить имена объектов. Точное определение sysname относится к правилам для идентификаторов. Поэтому он может различаются между экземплярами SQL Server. sysname - это функционально то же самое как nvarchar (128) за исключением того, что, по умолчанию, sysname не является нулем. В более ранние версии SQL Server,sysname определен как varchar(30).
есть ли вариант использования, который вы можете предоставить?
Если у вас когда-нибудь возникнет необходимость в создании некоторых динамический sql целесообразно использовать
sysnameкак тип данных для переменных, содержащих имена таблиц, столбцов и серверов.
просто как 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
позвольте мне перечислить вариант использования ниже. Надеюсь, это поможет. Здесь я пытаюсь найти владельца таблицы таблицы "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
FWIW, вы можете передать имя таблицы полезным системным SP вот так, если вы хотите изучить базу данных таким образом:
DECLARE @Table sysname; SET @Table = 'TableName'; EXEC sp_fkeys @Table; EXEC sp_help @Table;
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.
Comments