SQL COALESCE与DBNull签入C#

时间:2012-08-17 06:55:47

标签: c# sql performance

在我的项目中,我必须从SQL中检索大量数据并将数据映射到对象字段;像这样的东西:

cu.UnitName = dr["UnitName"].ToString().Trim();
cu.LocalId = DbUtil.RemoveNull(dr["LocalID"], "");
cu.DatabaseName = DbUtil.RemoveNull(dr["DatabaseName"], "");
cu.DatabaseServer = DbUtil.RemoveNull(dr["DatabaseServer"], "");
cu.UserName = DbUtil.RemoveNull(dr["UserName"], "");
cu.Password = DbUtil.RemoveNull(dr["Password"], "");
cu.RoleId = DbUtil.RemoveNull(dr["RoleId"], 0);

DbUtil.RemoveNull跟随int版本,string版本类似):

public static int RemoveNull(object data, int defaultValue)
    {
        if (data is DBNull || data == null)
            return defaultValue;
        return int.Parse(data.ToString());
    }

所以我想知道SQL的COALESCEISNULL是否可以更快地完成相同的工作。有人做过类似的比较吗?哪种方式会更有效率?

4 个答案:

答案 0 :(得分:0)

从数据库返回数据时,您可以

select COALESCE (data ,defaultValue) from table

会更快,因为不需要从前端代码执行RemoveNull函数

答案 1 :(得分:0)

cu.LocalId = dr["LocalId"] ?? "";

答案 2 :(得分:0)

而是在你的sql中使用以下语句:

  

SELECT ISNULL(value,0)

当存在NULL时,它将始终返回0。所以你不必在代码端转换它。

请参阅http://msdn.microsoft.com/en-us/library/ms184325.aspx

答案 3 :(得分:0)

'COALESCE'返回其参数中的第一个非空表达式,因此您可能会使用ISNULL

在数据库查询中使用ISNULL会快得多。想象一下,你有1m的记录,并且你调用一个C#方法1次,这肯定需要一些时间来执行。

另一方面,SQL引擎已经过优化,可以处理大量记录。但这不够灵活。您不能使用某些复杂的逻辑并轻松更改默认值。