我发现这种行为非常奇怪且违反直觉。(即使对于 SQL)。
set ansi_nulls off
go
;with sampledata(Value, CanBeNull) as
(
select 1, 1
union
select 2, 2
union
select 3, null
union
select 4, null
union
select 5, null
union
select 6, null
)
select ROW_NUMBER() over(partition by CanBeNull order by value) 'RowNumber',* from sampledata
Run Code Online (Sandbox Code Playgroud)
哪个返回
1 3 NULL
2 4 NULL
3 5 NULL
4 6 NULL
1 1 1
1 2 2
Run Code Online (Sandbox Code Playgroud)
这意味着为了计算行号,所有空值都被视为同一组的一部分。SET ANSI_NULLLS 是打开还是关闭都没有关系。但是,根据定义,null 是完全未知的,那么如何将 null 像这样组合在一起呢?据说为了将事物按等级顺序排列,苹果和橙子以及负 1 的平方根和量子黑洞或任何可以有意义地排序的东西。一些实验表明,第一列用于生成排名顺序为
select 1, '1'
union
select 2, '2' …Run Code Online (Sandbox Code Playgroud) 这是一种哲学问题.在一次采访中,我出席了GetDate,作为一个非确定性函数的例子.我明白为什么这个论点有水; 但这对我来说似乎是一个似是而非的争论.
详细说明:对于给定的实例及时(在100微秒范围内),getdate将返回特定值.
对于运行到相同时钟时间的两台计算机(通过足够精确的时钟同步),它们将返回相同的getdate值.
所以这是确定性的.
可以认为getdate在不同的时间返回不同的值,因此不能将其描述为确定性的.
但是sql查询"从y得到x,其中主键等于z"将返回x的相同值,其中z是相同的值.因此,如果时钟固定为某个值,那么我们将始终获得相同的getdate值.
换句话说,getdate的值由外部参数确定,与使用where子句的SQL查询完全相同的方式由where子句参数控制.
那么我们为什么要暗示getdate是非确定性的,而select查询中提供结果的任何其他变量参数都被描述为确定性的.
只是为了扩展问题; 如果数据发生变化,那么我们会在select查询中收到不同的值,然后我们解释这些值不会影响确定性(硬币化一个单词),因为值已经及时更改,就像getdate一样.
要扩展(作为编辑),我可以使用XP_CmdShell设置特定日期,然后立即运行GetDate(); 忽略了系统速度的变幻莫测等等.然后我会得到相同的答案.这有效地否定了系统日期时间不是输入的论点,因为我通过SQL修改了它,因此将整个过程保持在SQL控制的循环中.