在 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 值,您可以使用 CASEISNUMERIC。像这样的东西;

测试数据

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() 进行比较

如何在 Sql Server 2008 R2 中将列转换为行?

在 SQL Server 2008 中将两个表合并到一个索引视图中