2012-02-17 126 views
4

这可能真的很愚蠢。我真的不明白在T-SQL的NVarChar比较.. 如果我尝试类似的东西:NVarChar变量比较

DECLARE @A NVARCHAR = 'A'; 
DECLARE @AB NVARCHAR = 'AB'; 
if @A = @AB 
BEGIN 
PRINT N'A EQUALS AB'; 
END 

“A等于AB”印......你能告诉我为什么吗?

阅读本page并不能真正帮助...

感谢。

+1

试试这个。请停止这种坏习惯! http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx – 2012-02-17 14:43:41

回答

7

因为您声明的nvarchar变量没有指定长度,所以它们的默认长度为1.因此,这两个变量只包含第一个字符'A'。因为他们都是'NVARCHAR(1)`这意味着他们都是`N'A'`

DECLARE @A NVARCHAR(10) = 'A'; 
DECLARE @AB NVARCHAR(10) = 'AB'; 

if @A = @AB 
BEGIN 
PRINT N'A EQUALS AB'; 
END 
+2

我知道这很愚蠢。 – LB40 2012-02-17 14:24:02

+0

同意@Joe。当在数据定义或变量声明语句中未指定n时,缺省长度为1.当使用CAST和CONVERT函数时未指定n时,缺省长度为30.我最近在我的[blog]( http://nilthakkar.blogspot.in/2012/01/specify-size-for-character-data-type.html) – 2012-02-18 16:42:37

2
DECLARE @A NVARCHAR = 'A'; -- IS a NVARCHAR(1) containg 'A' 
DECLARE @AB NVARCHAR = 'AB'; -- IS also a NVARCHAR(1) containg 'A' 
DECLARE @AB2 NVARCHAR(2) = 'AB'; -- IS a NVARCHAR(2) containg 'AB' 

if @A = @AB 
BEGIN 
PRINT N'A EQUALS AB'; 
END 


if @A != @AB2 
BEGIN 
PRINT N'A NOT EQUALS AB'; 
END