SQL for nvarchar 0 =''& = 0?

时间:2011-11-07 19:04:56

标签: sql sql-server-2005

我在nvarchar列中搜索整数。我注意到如果该行包含''如果我只用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 

2 个答案:

答案 0 :(得分:3)

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

  

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

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

Select *
from #0Test
Where cast(test as int) = 0;

并且空字符串N''在转换为int时产生值0:

select cast(N'' as int)

-----------
0

(1 row(s) affected)

因此,预期的结果是您看到的结果,具有空字符串的行符合谓词test = 0的条件。进一步证明你不应该自由地混合类型。有关该主题的更详细讨论,请参阅How Data Access Code Affects Database Performance

答案 1 :(得分:1)

您隐含地使用int声明将字段转换为UNION

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

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

SELECT '0'

您将获得预期的结果。