此时会出现无法将DATETIME转换为INT

此时我们需要显式进行如下转换才行
DECLARE @int INT, @datetime DATETIME;
SELECT ISNULL(@int, CONVERT(INT,CURRENT_TIMESTAMP));
SELECT ISNULL(@int, CAST(CURRENT_TIMESTAMP AS INT));(2)ISNULL会造成数据丢失
我们再来看二者的对比的例子
DECLARE @c5 VARCHAR(5);
SELECT 'COALESCE', COALESCE(@c5, 'Jeffcky Wang')
UNION ALL
SELECT 'ISNULL', ISNULL(@c5, 'Jeffcky Wang');
上述我们定义字符串变量长度为5,而利用ISNULL字符串却被截取了,在这里我们可以认为ISNULL会导致数据的丢失而非出错。为什么会出现这样的结果呢?上述我们已经讲过ISNULL受第一个参数影响,其长度定义为5,所以只能为5,这是会进行截取,而COALESCE函数着眼于检测所有元素,此时为12所以会完全进行返回。我们通过运行如下就可以看出。
DECLARE @c5 VARCHAR(5);
SELECT
c = COALESCE(@c5, 'Jeffcky Wang'),
i = ISNULL(@c5, 'Jeffcky Wang')
INTO dbo.TestISNULL_COALESCE
SELECT name, t = TYPE_NAME(system_type_id), max_length, is_nullable
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.TestISNULL_COALESCE'); 
我们看到上述COALESCE合并的结果是可空的而ISNULL不是,有一点点不同。
(3)COALESCE对列计算时需要持久化
接下来我们看看二者最大的不同,我们通过计算列并且在其上面创建主键或者非空约束,看看ISNULL和COALESCE的区别
CREATE TABLE dbo.CreateISNULL
(
a INT,
b AS ISNULL(a, 15) PRIMARY KEY
);
我们再来看看COALESCE函数来计算列
CREATE TABLE dbo.CreateCOALESCE
(
a INT,
b AS COALESCE(a, 15) PRIMARY KEY
);
很明显我们需要对列进行持久化,通过添加PERSISTED关键字,如下即可。
CREATE TABLE dbo.CreateCOALESCE
(
a INT,
b AS COALESCE(a, 15) PERSISTED PRIMARY KEY
);










