在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型
Posted
技术标签:
【中文标题】在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型【英文标题】:Converting NVARCHAR to INT datatype in SQL Server 2008 【发布时间】:2017-04-19 22:13:49 【问题描述】:我收到此错误消息:-
将 nvarchar 值 '50AB' 转换为数据类型 int 时转换失败
在 SQL Server 2008 中运行以下查询时:
select
max(cast(substring(c.customername, 12, 4) as integer))
from customers c
请帮助我了解可用于解决此问题的转换类型。我已经尝试过使用Convert
,但我仍然遇到同样的问题。
【问题讨论】:
那是因为你不能像这样把字母转换成数字。您必须删除字母或以某种方式将它们转换为数字。 是的,但看起来在 sql server 2012 中我们可以使用 try_cast 来摆脱它..我们有 sql server 2008 的类似功能吗? 否-TRY_CAST
是 SQL Server 2012 中的一个新功能 - 如果您需要,您有升级到 2012(或更新)
try_cast 会因文本字符串而失败并返回 NULL。如果要转换为数字,则需要删除文本值。想一想,什么数字相当于'A'? SQL Server 是如何知道这一点的?
@TabAlleman 这是一个公平的观点。我发布了一个答案,当它不可转换时返回 null。
【参考方案1】:
如果可能的话,这是另一个将列转换为 INT
的逻辑,类似于 2012 年以后的 TRY_CONVERT
。
case 条件检查您的列何时不喜欢任何非数字。这是检查您的列是否IS LIKE 任何字符或特殊字符的简便方法。如果该列中有除数字以外的任何内容,则不会进行转换。如果它只是数字(这是我们进行INT
转换所需要的),那么转换就完成了。
SELECT
IdField
,DataField
,CASE WHEN DataField NOT LIKE '%[^0-9]%' THEN CONVERT(int, DataField) END New_Column
FROM #SampleData
【讨论】:
谢谢,这似乎在 SQL Server 2008 上运行。如果我的用户也通过 Oracle db 连接,这是否可行? 很高兴它为你工作@ManishAgarwal。恐怕我对 ORACLE 语法并不精通,但从逻辑上讲,它会的。【参考方案2】:如果您想在无法转换时返回 NULL
值,您可以使用 CASE
和 ISNUMERIC
。像这样的东西;
测试数据
CREATE TABLE #SampleData (IdField int, DataField nvarchar(10))
INSERT INTO #SampleData (IdField, DataField)
VALUES
(1,'50AB')
,(2,'1234')
查询
SELECT
IdField
,DataField
,CASE WHEN ISNUMERIC(DataField) = 1 THEN CONVERT(int, DataField) END New_Column
FROM #SampleData
结果
IdField DataField New_Column
1 50AB NULL
2 1234 1234
【讨论】:
只是想说明这不是防弹方法,在 2012 年之前确实没有防弹方法,但如果值类似于 '1e4' 或 '$' 或相当于ISNUMERIC = 1
的一系列其他选项将失败。 select case when ISNUMERIC('1e4') = 1 then convert (int,'1e4') end
@scsimon 是的,这并不适用于所有情况,还有其他可以满足这种情况的解决方法吗?
@ManishAgarwal 是只有字母数字还是有特殊字符?
它唯一的字母数字。以上是关于在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 中将查询结果导出到 .csv 文件
在 SQL Server 2008 R2 中将 varchar 转换为时间戳
如何在 SQL Server 2008 中将行切换到列,反之亦然
如何在 sql server 2008 中将日期与 GETDATE() 进行比较