【发布时间】:2014-01-31 18:33:15
【问题描述】:
我正在寻找“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 中的 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() 返回一个唯一标识符。
假设唯一标识符以数字方式进行比较似乎是合理的,所以如果 expression 是 NEWID() 我们的
类似地,RAND() 返回一个数值,它也会被计算为一个。
因此,虽然我无法在 Microsoft 的官方文档中找到任何解释 ORDER BY 在使用作为 表达式 的 order_by_expression 调用时的作用的任何内容,但它确实被记录在案,因为我知道它一定是。
【问题讨论】:
-
当您可以简单地测试它是否允许时,为什么还需要官方文档?
-
这对我来说很奇怪。一方面,你想要微软的官方文档,而你出于某种原因添加到问题中的“答案”引用了来自我从未听说过的公司的某个域名的一些文档,我什至不想去下载。接下来,我不确定您在该文档中确定的尚未向您解释的内容。最后,您的解释忽略了不同表达式行为不同的事实(例如,rand() 不会按行计算)。
-
@Anechoic 您最近添加的新编辑部分看起来像一个答案,而不是一个问题。因此,请将其从此处删除并将其添加为答案。
-
我(个人)不认为它回答了你提出的原始问题,但它是一个答案,它不应该是问题的一部分。
标签: sql-server tsql random sql-order-by newid