SQL Server中的SYSNAME数据类型是什么?

| SQL Server SYSNAME数据类型是什么? BOL说:   sysname数据类型用于   表列,变量和存储的   存储对象的过程参数   名称。 但我真的不明白。您可以提供一个用例吗?     
已邀请:
“ 0”是一个内置数据类型,最多可包含128个Unicode字符,即IIRC,主要用于在创建脚本时存储对象名称。其值不能为be1ѭ 与使用
nvarchar(128) NOT NULL
基本相同 编辑 正如@Jim在评论中提到的那样,我认为您实际上并没有使用ѭ0a的商业案例。它主要由Microsoft在SQL Server中构建内部“ 4”表和存储过程等时使用。 例如,通过执行
Exec sp_help \'sys.tables\'
,您将看到the6ѭ列被定义为
sysname
,这是因为其值实际上是本身的一个对象(一个表) 我对此太担心了。 还值得注意的是,对于那些仍在使用SQL Server 6.5及更低版本的人(还有人在使用它吗?),内置类型
sysname
等效于
varchar(30)
文献资料 “ 0”由文档“ 11”和“ 12”在备注部分中定义:   sysname是系统提供的用户定义的数据类型,在功能上等效于nvarchar(128),但它不能为空。 sysname用于引用数据库对象名称。 为了澄清以上说明,默认情况下,sysname定义为“ 13”,当然可以将其定义为可为空。同样重要的是要注意,确切的定义在SQL Server实例之间可能有所不同。 使用特殊数据类型   sysname数据类型用于表列,变量和存储   存储对象名称的过程参数。的确切定义   sysname与标识符规则相关。因此,它可以   在SQL Server实例之间有所不同。 sysname在功能上是相同的   与nvarchar(128)相同,除了默认情况下sysname不为NULL。在   在SQL Server的早期版本中,sysname定义为varchar(30)。     
  您可以提供用例吗? 如果您需要创建一些动态sql,则将“ 0”用作保存表名,列名和服务器名的变量的数据类型是适当的。     
就像是仅供参考。
select * from sys.types where system_type_id = 231
给您两行。 (我不确定这意味着什么,但我现在100%肯定它正在弄乱我的代码) 编辑:我想这意味着在这种情况下(我的情况)您应该由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
    
让我在下面列出一个用例。希望能帮助到你。在这里,我试图从数据库“学生”中找到表“ 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;
    
“ 0”由“ 25”使用,“ 25”是一个存储过程,该过程“向特定的收件人发送电子邮件”,位于msdb数据库中。 根据微软的说法,
[ @profile_name = ] \'profile_name\'  
     是发送消息的配置文件的名称。 profile_name的类型为sysname,带有   默认为NULL。 profile_name必须是现有名称   数据库邮件配置文件。如果未指定profile_name,   sp_send_dbmail为当前用户使用默认的专用配置文件。   如果用户没有默认的专用配置文件,则sp_send_dbmail   使用msdb数据库的默认公共配置文件。如果用户   没有默认的私人资料,也没有默认的公开资料   数据库的配置文件,必须指定@profile_name。     
另一个用例是使用using27的SQL Server 2016+功能时 以下语句将返回转换为格林尼治标准时间的日期
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)))
那么该变量的类型必须为“ 0”(将其声明为“ 31”会导致错误)。     

要回复问题请先登录注册