T-SQL:SUSER\u SNAME vs SUSER\u NAME?

T-SQL:SUSER\u SNAME vs SUSER\u NAME?,sql,sql-server,tsql,Sql,Sql Server,Tsql,MSDN文档说明了功能: 从用户的安全标识号(SID)返回登录标识名 除此之外,它还表示功能: 返回用户的登录标识名 尽管如此,当我执行以下SQL语句时,我得到了相同的结果: SELECT SUSER_NAME(); SELECT SUSER_SNAME(); 那么,有什么区别,我应该使用哪一个?是否有一种情况我应该使用其中一种而不是另一种 请各位指教, 提前感谢:)如果在没有参数的情况下调用函数,它们将返回相同的值。但他们有不同的观点: SUSER_SNAME()将登录名的varbinar

MSDN文档说明了功能:

从用户的安全标识号(SID)返回登录标识名

除此之外,它还表示功能:

返回用户的登录标识名

尽管如此,当我执行以下SQL语句时,我得到了相同的结果:

SELECT SUSER_NAME();
SELECT SUSER_SNAME();
那么,有什么区别,我应该使用哪一个?是否有一种情况我应该使用其中一种而不是另一种

请各位指教,


提前感谢:)

如果在没有参数的情况下调用函数,它们将返回相同的值。但他们有不同的观点:

  • SUSER_SNAME()将登录名的
    varbinary(85)SID
    作为参数
  • SUSER_NAME()接受登录名的
    整数主体id
您可以通过以下方式进行验证:

select  suser_name(principal_id)
,       suser_name(sid)
,       suser_sname(principal_id)
,       suser_sname(sid)
from    sys.server_principals 
where   name = suser_name()
只有第一列和最后一列将返回非空值。

SUSER\u NAME()将返回与sys.server\u主体中存在的sid关联的名称。sid必须存在于sys.server\u主体中

SUSER_SNAME()可以这样做,但如果登录名是active directory组的成员,则还可以返回登录名的sid

因此,如果Active Directory中有[CONTOSO\MyGroup],并且该组有一个用户[CONTOSO\MyUser]

然后将该组添加到SQL Server: 从WINDOWS创建登录名[CONTOSO\MyGroup]

选择SUSER_ID('CONTOSO\MyUser')、SUSER_SID('CONTOSO\MyUser'))

我会给你 空,CONTOSO\MyUser
因为CONTOSO\MyUser不在sys.server\u principals中,而是在A/D中

我执行了您提供的语句,并且只有第三列为null,所以似乎
SUSER\u NAME
同时接受
principal\u id
sid
。顺便说一句,如果这很重要的话,我正在使用SQL Server 2012。@MohammedA.Fadil:奇怪,我也在使用2012,第二列和第三列是
null
。可能存在这样一种情况:
cast(sid为int)
等于
principal\u id
,但这是非常重要的unlikely@MohammedA.Fadil:看到结果时,您是否以sa身份登录?我看到内置服务器主体的principal_id=sid。我使用的是SQL server 2012 SP1,我得到了与ask Andomar描述的相同的结果。我想我找到了Mohammed看到的空值较少的原因。尝试此查询:
从sys.server\u主体中选择sid、主体id、CONVERT(int,sid)SidConverted、suser\u name(主体id)NamePid、suser\u name(sid)NameSid、suser\u sname(主体id)SnamePid、suser\u sname(sid)SnameSid
。只要主体id和SidConverted相等,NameSid就会有一个值。我猜当使用
suser\u name(sid)
时,sid会隐式转换为int。