在T-SQL中是否有方法将nvarchar强制转换为int,并在转换失败时返回默认值或NULL?

推荐答案

如果您使用的是SQL Server 2012(或更新版本):

使用TRY_CONVERT function.

如果您使用的是SQL Server 2005、2008或2008 R2:

创建一个用户定义的函数.这将避免Fedor Hajdu mentioned与货币、小数等有关的问题:

CREATE FUNCTION dbo.TryConvertInt(@Value varchar(18))
RETURNS int
AS
BEGIN
    SET @Value = REPLACE(@Value, ',', '')
    IF ISNUMERIC(@Value + 'e0') = 0 RETURN NULL
    IF ( CHARINDEX('.', @Value) > 0 AND CONVERT(bigint, PARSENAME(@Value, 1)) <> 0 ) RETURN NULL
    DECLARE @I bigint =
        CASE
        WHEN CHARINDEX('.', @Value) > 0 THEN CONVERT(bigint, PARSENAME(@Value, 2))
        ELSE CONVERT(bigint, @Value)
        END
    IF ABS(@I) > 2147483647 RETURN NULL
    RETURN @I
END
GO

-- Testing
DECLARE @Test TABLE(Value nvarchar(50))    -- Result
INSERT INTO @Test SELECT '1234'            -- 1234
INSERT INTO @Test SELECT '1,234'           -- 1234
INSERT INTO @Test SELECT '1234.0'          -- 1234
INSERT INTO @Test SELECT '-1234'           -- -1234
INSERT INTO @Test SELECT '$1234'           -- NULL
INSERT INTO @Test SELECT '1234e10'         -- NULL
INSERT INTO @Test SELECT '1234 5678'       -- NULL
INSERT INTO @Test SELECT '123-456'         -- NULL
INSERT INTO @Test SELECT '1234.5'          -- NULL
INSERT INTO @Test SELECT '123456789000000' -- NULL
INSERT INTO @Test SELECT 'N/A'             -- NULL
SELECT Value, dbo.TryConvertInt(Value) FROM @Test

Reference:我在创建解决方案时广泛使用了this page.

Sql相关问答推荐

如何创建具有部分可空列的两个表的联合

根据内容确定要插入的列

SQL查询以创建手头的流动余额?

如何根据SQL中的列条件获取下一个时间戳?

SQL—如何根据2列填写缺失的值

基于前面行的值:当x&>2时重复1,当连续3行x=0时则重复0

多条件SQL排序行为

用VB.NET在Dapper中实现MS Access数据库顺序透视

每个学校 Select N个最新的行,但跳过同一学生的重复行

如何在MS Access中基于另外两个表自动填充一个表中的字段?

通过UPDATE SELECT更新表时出现问题

使用 SQL 将列添加到 Access 数据库时出错

使用 XML 作为 SQL 表

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

Postgres,使用 select 插入多个值

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

计算组内多个日期间隔go 年的累计天数

Postgresql 具有相似行为和模式行为的问题

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索