我不是SQL的专家,但我在Microsoft SQL Server中遇到了一些非常奇怪的行为。我很确定这是一个错误 - 但是在我得出结论之前想把它带给更有经验的人。 (而且我不确定如果是这样的话我会如何向微软报告呢。)
环境
@@ Version =>
Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
May 4 2015 19:11:32
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
第1步:创建有问题的功能
我要求你创建两个函数 - 这两个函数都应该使用相同的恕我直言,但似乎其中一个表现得有点滑稽。 首先,违规功能:
if OBJECT_ID('test_function_bad') is not null
drop function test_function_bad;
go
create function test_function_bad (@val int)
returns table
as return
(select @val as MyBadValue
where @val < 3
);
go
接下来,几乎完全相同的功能按预期工作:
if OBJECT_ID('test_function_good') is not null
drop function test_function_good;
go
create function test_function_good (@val int)
returns table
as return
(select @val * 1 as MyGoodValue
where @val < 3
);
第2步:创建测试表
if OBJECT_ID('tempdb..#test') is not null
drop table #test;
create table #test (id int, val char);
insert into #test
(id, val)
values (1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D');
Bug(可能) 运行以下代码:
select *
from #test a
outer apply dbo.test_function_bad(a.id);
它给出了结果:
id val MyValue
----------- ---- -----------
1 A 1
2 B 2
3 C 3
4 D 4
这很奇怪......我期待NULLS而不是MyValue下的“3”和“4”。 为什么此函数返回值> = 3?它应该只返回1和2,没有别的。对?为了确认这一点,让我们运行以下内容:
select *
from #test a
outer apply dbo.test_function_good(a.id);
这有效......它提供了以下内容:
id val MyValue
----------- ---- -----------
1 A 1
2 B 2
3 C NULL
4 D NULL
问题
这是一个问题:这真的是一个错误吗? (我猜你们中的一些专家可能熟悉SQL中的各种错误 - 但我不是,这是我看到的第一个错误。我只想确保对此行为没有解释)
跟进问题:如果这是一个错误,那么我会向Microsoft报告吗?报告它有什么意义吗?他们在乎吗?
免责声明:我确实尝试过搜索但未找到任何内容。