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

jra*_*ara 119 sql t-sql sql-server types

什么是SQL Server SYSNAME数据类型?BOL说:

sysname数据类型用于存储对象名称的表列,变量和存储过程参数.

但我真的不明白.是否有可以提供的用例?

cod*_*ger 132

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

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

编辑

正如@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),但它不可为空.sysname用于引用数据库对象名称.

为了澄清上述说明,默认情况下 定义sysname,因为NOT NULL它当然可以将其定义为可空.同样重要的是要注意,确切的定义可能因SQL Server实例而异.

使用特殊数据类型

数据类型为sysname数据类型用于表的列,变量和存储存储对象名称过程参数.sysname的确切定义 与标识符规则有关.因此,它可以在SQL Server的实例之间变化.sysname在功能上与nvarchar(128)相同,但默认情况下sysname为NOT NULL.在早期版本的SQL Server中,sysname被定义为varchar(30).

  • 您可以在脚本中使用`sysname`来实现前向(和后向)兼容性. (9认同)
  • @Barry实际上......根据`sys.types`,它是一个`nvarchar(256)not null`.请注意,系统类型ID = 231(nvarchar).它现在在TDS中作为类型别名起作用; 别名的第一个ID是256,对应于`sysname`.至于用法:`sysname`用于信息模式. (3认同)
  • @atlaste sys.tables中的max_length长度以字节为单位.nvarchar每个字符使用两个字节,这就是为什么它被定义为nvarchar(128). (2认同)

Mik*_*son 57

你可以提供用例吗?

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


glo*_*uin 8

就像一个仅供参考....

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

(我还不确定这意味着什么,但我 100% 确定它现在弄乱了我的代码)

编辑:我想这意味着你应该在这种情况下(我的情况)加入 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
Run Code Online (Sandbox Code Playgroud)
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 
Run Code Online (Sandbox Code Playgroud)

这个查询:

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
Run Code Online (Sandbox Code Playgroud)

产量:

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
Run Code Online (Sandbox Code Playgroud)

和这个:

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
Run Code Online (Sandbox Code Playgroud)

给你这个:

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
Run Code Online (Sandbox Code Playgroud)

  • 在 system_type_id 和 user_type_id 上针对 sys.types 加入。[SQL 小提琴](http://sqlfiddle.com/#!6/257d3/1) (3认同)