什么是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的sysnamevarchar(30)

文档

sysnamencharnvarchar的文档在备注部分中定义:

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.