Nvarchar与逻辑运算符一起工作吗?

时间:2019-03-09 08:32:07

标签: sql sql-server

这里只需要您的帮助即可。

我有一张桌子T

A (nvarchar)         B()
-------------------------- 
'abcd'
'xyzxcz'

B应该输出我所做的A中条目的长度

UPDATE T
SET B = LEN(A)    -- I know LEN function returns int

但是当我使用sp_help T检出B的数据类型时,它显示列B为nvarchar

这是怎么回事?

select A
from T 
where B > 100

还返回了正确的输出?

为什么nvarchar使用逻辑运算符?

请帮助。

3 个答案:

答案 0 :(得分:2)

检查https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-2017表示在移动,比较或存储变量时已显式或隐式转换了数据类型。在您的情况下,您将B列与100进行比较,强制sql server隐式将其转换为整数类型(请查看同一页上有关转换的图片)。为了证明这一点,请尝试更改在B列中放置一些文本的行,并在重复选择查询B> 100后,sql server尝试从文本中获取整数时将抛出conversione错误。

答案 1 :(得分:2)

由于类型之间的隐式转换而起作用。

Data type precedence

  

当运算符组合不同数据类型的表达式时,优先级较低的数据类型将首先转换为优先级较高的数据类型。如果该转换不是受支持的隐式转换,返回错误。

     

类型优先级:

16. int
...
25. nvarchar (including nvarchar(max) )

在您的示例中:

select A
from T 
where B > 100
     --nvarchar and int (B is implicitly casted to INT)

答案 2 :(得分:0)

在以ssms的形式向表中添加列时,未添加数据类型时,将选择“默认”数据类型。对我来说,在2017年开发人员中,它是nchar(10)。如果希望将其设置为int,则使用int的数据类型定义列。在tsql中应该是

create table T (
     A nvarchar --for me the nvarchar without a size gives an nvarchar(2)
    ,B int
);

sp_help T

--to make a specific size, largest for nvarchar is 4000 or max...max is the replacement for ntext of old, as.
create table Tmax (
     A nvarchar(max)
    ,B int
);

--understanding nvarchar and varchar for len() and datalength()

select 
     datalength(N'wibble') datalength_nvarchar -- nvarchar is unicode and uses 2 bytes per char, so 12
    ,datalength('wibble') datalength_varchar -- varchar uses 1 byte per so 6
    ,len(N'wibble') len_nvarchar -- count of chars, so 6
    ,len('wibble') len_varchar -- count of char so still 6

nvarchar(max) and varchar(max)

希望这会有所帮助,问题有点分散