我正在寻找“ORDER BY RAND()”和“ORDER BY NEWID()”的官方 T-SQL 文档。有许多文章描述了它们,因此必须在某个地方记录它们。
我正在寻找这样的官方 SQL Server 文档页面的链接: http ://technet.microsoft.com/en-us/library/ms188385.aspx
澄清:
我正在寻找的是“order_by_expression”的文档,它解释了非负整数常量、返回非负整数的函数和返回任何其他值的函数(如 RAND() 或 NEWID() )。
回答:
我为我最初的问题缺乏明确性表示歉意。与大多数与编程相关的问题一样,该问题的解决方案主要是弄清楚您实际上要回答什么问题。
谢谢大家。
答案在本文档中:来自: http: //www.wiscorp.com/sql200n.zip
Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation)
22.2 <direct select statement: multiple rows> includes a <cursor specification>.
至此,我们有了答案的前半部分:
SELECT 语句是一种 CURSOR,这意味着可以在每一行上迭代地执行操作。尽管我没有在文档中找到明确说明的语句,但我很乐意假设 order_by_expression 中的表达式将为每一行执行。
现在,当您使用 RAND() 或 NEWID() 或 CEILING(RAND() + .5) / 2 而不是数字常量或列名时,发生了什么是有意义的。
该表达式永远不会被视为列号。它始终是为每一行生成的值,将用作确定行顺序的基础。
但是,为了彻底起见,让我们继续对表达式的完整定义。
14.3 <cursor specification> includes ORDER BY <sort specification list>.
10.10 <sort specification list> defines:
<sort specification> ::= <sort key> [ <ordering specification> ] [ <null ordering> ]
<sort key> ::= <value expression>
<ordering specification> ::= ASC | DESC
<null ordering> ::= NULLS FIRST | NULLS LAST
这将我们带到:
6.25 <value expression>
我们在哪里找到答案的后半部分:
<value expression> ::=
<common value expression>
| <boolean value expression>
| <row value expression>
<common value expression> ::=
<numeric value expression>
| <string value expression>
| <datetime value expression>
| <interval value expression>
| <user-defined type value expression>
| <reference value expression>
| <collection value expression>
<user-defined type value expression> ::= <value expression primary>
<reference value expression> ::= <value expression primary>
<collection value expression> ::= <array value expression> | <multiset value expression>
从这里我们深入到可以使用的众多可能的表达式类型。
NEWID() 返回一个唯一标识符。
假设唯一标识符以数字方式进行比较似乎是合理的,因此如果表达式是 NEWID(),我们的 <common value expression> 将是一个 <numeric value expression>。
类似地,RAND() 返回一个数值,它也将被评估为一个<数值表达式>。
因此,尽管我无法在 Microsoft 的官方文档中找到任何解释 ORDER BY 在使用作为表达式的 order_by_expression 调用时的作用的任何内容,但它确实已记录在案,因为我知道它必须如此。