什么是SQL Server中的SYSNAME数据types?
什么是SQL Server SYSNAME数据types? BOL说:
sysname数据types用于存储对象名称的表列,variables和存储过程参数。
但我真的不明白 有没有可以提供的用例?
sysname
是一种内置数据types,限于128个Unicode字符,IIRC主要用于在创build脚本时存储对象名称。 它的值不能为NULL
这与使用nvarchar(128) NOT NULL
基本相同
编辑
正如@Jim在评论中提到的那样,我不认为真的有一个商业案例可以使用sysname
。 当在SQL Server中构build内部sys
表和存储过程时,它主要由Microsoft使用。
例如,通过执行Exec sp_help 'sys.tables'
你会看到列name
被定义为sysname
这是因为这个值本身就是一个对象(一个表)
我会担心的太多了。
还值得注意的是,对于仍在使用SQL Server 6.5及更低版本的用户(还有人在使用它?),内置types的sysname
与varchar(30)
文档
sysname
用nchar
和nvarchar
的文档在备注部分中定义:
sysname是一个系统提供的用户定义的数据types,其function与nvarchar(128)等效,但不能为空。 sysname用于引用数据库对象名称。
为了澄清上面的说法, 默认情况下, sysname被定义为NOT NULL
,当然可以将其定义为可空。 同样重要的是要注意,确切的定义可以在SQL Server实例之间有所不同。
使用特殊数据types
sysname数据types用于存储对象名称的表列,variables和存储过程参数。 sysname的确切定义与标识符的规则有关。 因此,它可以在SQL Server的实例之间变化。 sysname在function上与nvarchar(128)相同,只是缺省情况下sysname不是NULL。 在早期版本的SQL Server中, sysname被定义为varchar(30)。
有没有用例可以提供?
如果你曾经需要创build一些dynamic的sql,那么使用sysname
作为数据types来保存表名,列名和服务器名是合适的。
就像一个FYI ….
select * from sys.types where system_type_id = 231
给你两行。
(我不确定这意味着什么,但我100%确定它现在搞乱了我的代码)
编辑:我想是什么意思是你应该join由user_type_id在这种情况下(我的情况)或可能都是user_type_id和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
让我列出一个用例如下。 希望它有帮助。 在这里,我试图从数据库'学生'中findTable'Stud_dtls'的Table Owner。 正如Mikael所提到的,当需要创build一些需要variables来存储表名,列名和服务器名的dynamicsql时,可以使用sysname。 只是想提供一个简单的例子来补充他的观点。
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数据库中的存储过程。
据微软称 ,
[ @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.