今天我正在工作场所测试一下,遇到这个
情况1:
Declare @a nvarchar(20) Set @a = null Select IsNull(LTrim(RTrim(Lower(@a))),-1)
情况2:
Select IsNull(LTrim(RTrim(Lower(null))),-1)
情况1的结果为-1,但在情况2中为*
在这两种情况下,我都期待同样的结果.任何原因?
解决方法
没有数据类型的声明,在这种情况下,null被声明为varchar(1).您可以通过将结果选择到#temp表来观察这一点:
Select IsNull(LTrim(RTrim(Lower(null))),-1) as x INTO #x; EXEC tempdb..sp_help '#x';
您会看到以下结果:
Column_name Type Length ----------- ------- ------ x varchar 1
因为-1不能适应varchar(1),所以你会得到*作为输出.这类似于:
SELECT CONVERT(VARCHAR(1),-1);
如果要折叠为字符串,则建议将整数括在单引号中,以避免由整数< - >引起混淆.不需要的字符串转换
SELECT CONVERT(VARCHAR(1),'-1'); -- yields "-" SELECT CONVERT(VARCHAR(30),'-1'); -- yields "-1"
我不会对sql Server如何处理明确提供为null的“值”做出任何假设,特别是当复杂表达式使得难以预测哪些评估规则可能胜过数据类型优先级时.