在SQL Server中将数字转换为INT的正确方法

本文关键字:INT 方法 转换 Server SQL 数字 | 更新日期: 2023-09-27 18:10:38

我得到一个无效的强制转换异常,因为我的COALESCE正在处理一个数字数据类型值,也是一个int数据类型值。

查询运行正常,但是c#抛出了一个无效强制转换异常。

我添加了一个强制转换到我的COALESCE,但仍然得到无效强制转换异常。

问题:我是否在我的COALESCE中正确地铸造了这个?

错误中涉及的属性声明如下:

public int  StartingMembershipCount { get; set; }

错误发生的地方在这里

 m.StartingMembershipCount = r.GetNullableInt32("StartingMembershipCount",0);

我的数据助手定义为:

public static int GetNullableInt32(this IDataRecord r, string name, int defaultValue)
{
    var ordinal = r.GetOrdinal(name);
    int returnVal = 0;
    if (r.IsDBNull(ordinal))
         returnVal = defaultValue;
    else
       returnVal = r.GetInt32(ordinal);

    return returnVal;
}

这是我的COALESCE(表达式1具有数字数据类型)

COALESCE((
-- Expression 1
SELECT CAST(n.TOTAL_MBR AS INT)
FROM
usr_kiw_cus_certified n INNER JOIN
(SELECT ClubId, min(AsOfDate) AsOfDate FROM
  (SELECT ukm.MASTER_CUSTOMER_ID ClubId, ukm.AS_OF_DATE AsOfDate FROM usr_kiw_cus_certified ukm WHERE ukm.AS_OF_DATE > @StartDate AND ukm.master_customer_id = c.MASTER_CUSTOMER_ID) as temp
 GROUP BY ClubId) AS datetable 
 ON datetable.ClubId = n.MASTER_CUSTOMER_ID and n.AS_OF_DATE = datetable.AsOfDate
 ),
 -- Expression 2
(SELECT COUNT(cr.MASTER_CUSTOMER_ID) 
FROM cus_relationship cr 
WHERE cr.RELATED_MASTER_CUSTOMER_ID = c.MASTER_CUSTOMER_ID
AND cr.RELATIONSHIP_TYPE = 'employment' 
GROUP BY cr.RELATED_MASTER_CUSTOMER_ID
)) AS StartingMembershipCount,

在SQL Server中将数字转换为INT的正确方法

必须强制转换整个表达式:

CAST(COALESCE((SELECT ...),(SELECT ...)) AS INT) AS StartingMembershipCount,

当子查询没有返回任何行时,SELECT中的CAST(或类型)不适用。

或者您可以"只"强制转换整个第一个子查询,因为第二个子查询应该总是返回一个结果:

COALESCE(CAST((SELECT ...) AS INT), (SELECT ...)) AS StartingMembershipCount,

因为第二个总是返回一个结果,所以它实际上根本不需要为NULLable。使用ISNULL应该修复:

ISNULL(CAST((SELECT ...) AS INT), (SELECT ...)) AS StartingMembershipCount,

ISNULL的缺点是,如果你需要第三个参数,它不支持;这不是标准的。优点是结果不是NULLable,因此可以直接使用GetInt32。

顺便说一下,当我在c#中遇到这个异常时,我通常会暂时切换到r.GetValue(ordinal)来作为对象返回值(当然,你不能将其赋值给int变量),然后检查其类型