我正在使用一个列,我希望USER_NAME()在SQL Server 2008 R2中保存该函数的值.在BOL中,该函数被记录为具有返回类型NVARCHAR(256).
但是,在其中一个示例中,他们这样做:
SELECT name FROM sysusers WHERE name = USER_NAME(1)
Run Code Online (Sandbox Code Playgroud)
并且sysusers.name列有类型sysname,这是(据我所知)有效的NVARCHAR(128) NOT NULL.这种不一致性在文档中进一步巩固CURRENT_USER,其中说"此函数等效于USER_NAME()",但表明其类型是sysname(当然,它继续有一个示例,它使用CURRENT_USER作为VARCHAR(30)列的默认值... )
是什么赋予了?BOL的类型是错误的USER_NAME()吗?我使用它是否安全NVARCHAR(128)?
Aar*_*and 10
好吧,我们来看看:
SELECT name, system_type_id, user_type_id, max_length
FROM sys.types WHERE name IN (N'sysname', N'nvarchar');
Run Code Online (Sandbox Code Playgroud)
结果:
name system_type_id user_type_id max_length
-------- -------------- ------------ ----------
nvarchar 231 231 8000
sysname 231 256 256
Run Code Online (Sandbox Code Playgroud)
sysname只是一个别名类型nvarchar,其定义的字符数为128(不是256).原因sys.types是256是nvarchar每个字符有2个字节 - 所以这是128个字符x 2个字节= 256个字节.它们与我们通常所做的"长度"并不意味着相同的事情.
没有回答"为什么"BOL说的原因 - 联机丛书是错误的,就是这样.证明:
SELECT x = USER_NAME() INTO #foo;
EXEC tempdb..sp_help '#foo';
Run Code Online (Sandbox Code Playgroud)
部分结果:
Column_name Type Length
----------- -------- ------
x nvarchar 256
-----------------------^^^
---- again, this is 128 characters
Run Code Online (Sandbox Code Playgroud)
是的,你应该安全使用NVARCHAR(128),但为了以防万一,它是否会花费你额外的东西来匹配文档?另外,请停止查看已弃用的系统表,例如sysusers有关数据类型选择的指导和证实文档.虽然sys.database_principals和sys.server_principals也使用sysname在这种情况下,他们是一个更可靠的检查SQL Server的今天如何工作的,除非你真的正在调查SQL Server如何13+年前的工作.
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |