nvarchar 0的SQL=''&=0?

nvarchar 0的SQL=''&=0?,sql,sql-server-2005,Sql,Sql Server 2005,我在nvarchar列中搜索整数。我注意到,如果该行包含或0,则如果仅使用0进行搜索,则会拾取该行 我假设发生了某种隐式转换,也就是说0等于。为什么它分配两个值 下面是一个测试: --0 Test create table #0Test (Test nvarchar(20)) GO insert INTO #0Test (Test) SELECT '' UNION ALL SELECT 0 UNION ALL SELECT '' Select * from #0Tes

我在nvarchar列中搜索整数。我注意到,如果该行包含或0,则如果仅使用0进行搜索,则会拾取该行

我假设发生了某种隐式转换,也就是说0等于。为什么它分配两个值

下面是一个测试:

--0 Test
create table #0Test (Test nvarchar(20))

GO
insert INTO #0Test (Test)
    SELECT ''
UNION ALL
    SELECT 0
UNION ALL
    SELECT ''

Select *
from #0Test

Select *
from #0Test
Where test = 0

SELECT *
from #0Test
Where test = '0'

SELECT *
from #0Test
Where test = ''

drop table #0Test 

您正在使用UNION语句将字段隐式转换为int

两个空字符串和整数0将生成一个int字段。这是在插入nvarchar字段之前,因此临时表中的数据类型是不相关的

尝试将联合中的第二个选择更改为:

选择“0”


您将得到预期的结果。

您正在使用UNION语句将字段隐式转换为int

两个空字符串和整数0将生成一个int字段。这是在插入nvarchar字段之前,因此临时表中的数据类型是不相关的

尝试将联合中的第二个选择更改为:

选择“0”


您将得到预期的结果。

您看到的行为就是产品文档中描述的行为。的规则指定int的优先级高于nvarchar,因此操作必须以int类型进行:

当运算符组合两个不同数据类型的表达式时 数据类型优先级规则指定具有 较低优先级转换为具有较高优先级的数据类型 优先权

因此,您的查询实际上如下所示:

Select *
from #0Test
Where cast(test as int) = 0;
当转换为int时,空字符串N产生值0:


因此,预期结果就是您看到的结果,带有空字符串的行符合谓词test=0的条件。进一步证明,您永远不应该自由混合类型。有关该主题的更详细讨论,请参阅。

您看到的行为是产品文档中描述的行为。的规则指定int的优先级高于nvarchar,因此操作必须以int类型进行:

当运算符组合两个不同数据类型的表达式时 数据类型优先级规则指定具有 较低优先级转换为具有较高优先级的数据类型 优先权

因此,您的查询实际上如下所示:

Select *
from #0Test
Where cast(test as int) = 0;
当转换为int时,空字符串N产生值0:


因此,预期结果就是您看到的结果,带有空字符串的行符合谓词test=0的条件。进一步证明,您永远不应该自由混合类型。有关该主题的更详细讨论,请参阅。

相同的结果,test=0的select语句仍然会获取所有三行。我认为它应该只由0中的一行执行。@BrettK-您需要使用WHERE test='0'-数字整数0计算为空字符串以及相同的结果,test=0中的select语句仍然会获得所有三行。我认为它应该只由一行0组成。@BrettK-您需要使用WHERE test='0'-数字整数0也计算为空字符串,谢谢这正是我要找的。我意识到有一些转换正在进行,但我不能把我的手指放在上面。谢谢这正是我要找的。我意识到有一些转换正在进行,但我不能把我的手指。