SQLServer 中的 SYSNAME 数据类型是什么?

什么是 SQLServerSYSNAME 数据类型? BOL说:

Sysname 数据类型用于 表列、变量和存储的 存储对象的过程参数 名字。

但我真的不明白,你能提供什么用例吗?

162528 次浏览

sysname是一种内置的数据类型,限制为128个 Unicode 字符,IIRC 主要用于在创建脚本时存储对象名称。它的值不能是 NULL

它基本上与使用 nvarchar(128) NOT NULL相同

剪辑

正如@Jim 在评论中提到的那样,我认为实际上并不存在使用 sysname的商业案例。它主要被微软用于在 SQLServer 中构建内部 sys表和存储过程等。

例如,通过执行 Exec sp_help 'sys.tables',您将看到列 name被定义为 sysname,这是因为 this 的值实际上是一个对象本身(一个表)

我不会太担心的。

同样值得注意的是,对于那些仍在使用 SQL Server 6.5或更低版本的用户(还有人在使用它吗?)内置的 sysname类型相当于 varchar(30)

文件

sysname的定义与 ABC1和 nvarchar < a href = “ http://msdn.microsoft.com/en-us/library/ms186939.aspx”rel = “ noReferrer”> ABC1和 nvarchar 的文档一起,在备注部分:

Sysname 是系统提供的用户定义数据类型,功能上等同于 Nvarchar (128),但它不能为空。Sysname用于引用数据库对象名称。

为了澄清上述意见,违约Sysname定义为 NOT NULL,当然可以将其定义为可空。同样重要的是要注意,SQLServer 实例之间的确切定义可能有所不同。

使用特殊数据类型

Sysname数据类型用于表列、变量和存储 存储对象名称的过程参数 Sysname 与标识符规则相关 不同的 SQLServer.Sysname在功能上是相同的 除了在默认情况下,Sysname不是 NULL 早期版本的 SQLServer 中,Sysname定义为 varchar (30)。

关于 sysname允许或不允许 NULL值的更多信息可以在这里找到 https://stackoverflow.com/a/52290792/300863

仅仅因为它是默认值(为 NOT NULL)并不能保证它会是!

你能提供什么用例吗?

如果您需要创建一些 动态 sql 动态 sql,最好使用 sysname作为包含表名、列名和服务器名的变量的数据类型。

仅供参考。

select * from sys.types where system_type_id = 231给你两行。

(我还不确定这意味着什么,但我100% 肯定它正在搞乱我的代码)

Edit: 我猜这意味着在这种情况下(我的情况) ,您应该使用 user _ type _ id 或者 user _ type _ id 和 system _ 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

让我在下面列出一个用例。希望能有帮助。在这里,我试图从 DB“ Student”中找到表“ Stud _ dtls”的表所有者。正如 Mikael 提到的,当需要创建一些动态 sql 时,可以使用 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;

sp_send_dbmail使用 sysname,这是一个存储过程,“向指定收件人发送电子邮件”,位于 msdb 数据库中。

根据 微软,

[ @profile_name = ] 'profile_name'

要从中发送消息的配置文件的名称 缺省值为 NULL。 profile _ name 必须是现有 数据库邮件配置文件。如果未指定 profile _ name, Sp _ send _ dbmail 使用当前用户的默认私有配置文件。 如果用户没有默认的私有配置文件 sp _ send _ dbmail 使用 msdb 数据库的默认公共配置文件 没有默认的私有配置文件,也没有默认的公共配置文件 配置文件,则必须指定@profile _ name。

另一个用例是在使用 AT TIME ZONE的 SQLServer2016 + 功能时

下面的语句将返回一个转换为 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会导致错误)。

你能提供什么用例吗?

要存储对象名以供数据库维护脚本使用的任何位置。例如,脚本从具有日期列的某些表中清除旧行。它配置了一个表,提供表名、要筛选的列名以及要保留多少天的历史记录。另一个脚本将某些表转储到 CSV 文件中,并再次配置一个列出要转储的表的表。这些配置表可以使用 sysname类型存储表名和列名。