SQL 2012中的错误? TVF在外部申请中给出意外结果

时间:2016-03-10 09:27:25

标签: sql-server sql-server-2012

我不是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报告吗?报告它有什么意义吗?他们在乎吗?

免责声明:我确实尝试过搜索但未找到任何内容。

0 个答案:

没有答案