2012-02-17 2 views
4

Возможно, это действительно глупо. Я не очень понимаю, сравнение NVARCHAR в T-SQL .. если я попробовать что-то вроде этого:Сравнение переменных NVarChar

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

«A РАВНО AB» печатается ... Не могли бы вы сказать мне, почему?

Читая это page не помогает ...

спасибо.

+1

Потому что они оба 'NVARCHAR (1)', что означает, что они оба 'N'A''. Пожалуйста, прекратите эту плохую привычку! http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx –

ответ

7

Поскольку вы объявляете свои переменные nvarchar без заданной длины, они по умолчанию имеют длину 1. Следовательно, обе переменные содержат только первый символ 'A'.

Попробуйте вместо этого:

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

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

Я знал, что это глупо. – LB40

+0

Согласен с @Joe. Когда n не указано в инструкции определения данных или объявления переменной, длина по умолчанию равна 1. Когда n не указывается при использовании функций CAST и CONVERT, длина по умолчанию равна 30. Я недавно опубликовал об этом на моем [блоге] (http://nilthakkar.blogspot.in/2012/01/specify-size-for-character-data-type.html) –

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