Mos*_*han 1 t-sql sql-server ssms
我有一个表格X,上面有一个accountNo列表.该字段(accoutNo)是nvarchar(8).现在问题是我们有时会在这个字段中获得字符,我想将它转换为bigint.
对不起,我不能在这里用表格格式.
我能够检查accountNo是否是数字值:
select x.accountNo from x where ISNUMERIC(x.accountNo)=1
Run Code Online (Sandbox Code Playgroud)
但是当我尝试仅转换值时,如果accountNo是数字,我仍然不能,我很困惑:
select x.accountNo, convert(bigint,x.accountNo) from x where ISNUMERIC(x.accountNo)=1
Run Code Online (Sandbox Code Playgroud)
我收到的具体错误:
消息8114,级别16,状态5,行1错误将数据类型nvarchar转换为bigint.
accountNo A0001001 A0001002 A0001003 /0005856 !0005046 ~0005872 A.005698 A/005623 A./00578 ./214536
Run Code Online (Sandbox Code Playgroud)
你应该使用CAST()或TRY_CAST()代替:
declare @test nvarchar(8) = '12345678'
select cast(@test as bigint) -- errors on failure
select try_cast(@test as bigint) -- returns null on failure
Run Code Online (Sandbox Code Playgroud)
此外,重要的ISNUMERIC()是要指出并不完美.来自文档:
对于某些不是数字的字符,ISNUMERIC返回1,例如加号(+),减号( - )和有效货币符号,例如美元符号($).有关货币符号的完整列表,请参阅money和smallmoney(Transact-SQL).
出于这个原因,我不认为逻辑检查在这里是有价值的.最好TRY_CAST()在所有值上使用,无论是否存在字符,并以可预测的方式处理空响应.