这里只需要您的帮助即可。
我有一张桌子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
使用逻辑运算符?
请帮助。
答案 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)
由于类型之间的隐式转换而起作用。
当运算符组合不同数据类型的表达式时,优先级较低的数据类型将首先转换为优先级较高的数据类型。如果该转换不是受支持的隐式转换,返回错误。
类型优先级:
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)
希望这会有所帮助,问题有点分散