我键入下面的T-SQL代码到一个SQL查询窗口的行为的真正的奥秘:与SUSER_SID在简单的T-SQL查询
-- Get the SUSER_SID standalone
SELECT SUSER_SID('sql_someuser') AS SUSER_SID_OF_SQL_SOMEUSER
-- Get the SUSER_SID as part of a more complex query (should be the same, right?)
SELECT UserSid, UserId FROM User..UserSidToUserId
UNION ALL
SELECT SUSER_SID('sql_someuser'),12345
下面是结果集,我得到:
第二个结果集的前两行直接来自UserSidToUserId
表。但最后一行UserId
的12345
即UNION ALL
的第二个查询所添加的那个,UserSid
的第二个调用SUSER_SID
与生成的那一个完全相同的用户名是不同的!
更新: 正是如此,没有混乱,这里是UserSidToUserId
表的定义:
CREATE TABLE dbo.UserSidToUserId
(
UserSid uniqueidentifier NOT NULL,
UserId int NOT NULL,
)
如何两个调用使用相同的用户名SUSER_SID
产生的结果取决于上下文中使用SUSER_SID
,因为它是一个独立于上下文的绝对调用?
转换'SUSER_SID()'的'VARCHAR'产生不可打印垃圾......这不是问题。我还将'UserSidToUserId'表的定义添加到原始问题中。 – 2012-03-07 17:19:35
它仍然是一个数据类型的差异(我只是不知道你的基表是如何定义的)。你为什么使用'UNIQUEIDENTIFIER'? 'SUSER_SID()'不是一个GUID - 它返回'VARBINARY(85)'。因此,为了与您的表格匹配,基于数据类型优先级,您的联合会尝试将其'SUSER_SID()'调用转换为GUID。如果你希望它们看起来一样,那么改变你的表定义为'VARBINARY(85)',或者在调用'SUSER_SID()'时直接使用'CONVERT'。 – 2012-03-07 17:26:29
根据最新评论,您的解决方案是正确的。所以,我会改变我的表格定义,并且我已经接受了你的答案......但是,我引用了SQL Server对SUSER_ID的帮助:“如果登录是SQL Server登录,则SID映射到GUID。 – 2012-03-07 17:33:55