我在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
答案 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'
您将获得预期的结果。