2011-02-09 83 views
4

有人可以请向我解释这个查询是怎么回事?不寻常的T-SQL - 这里发生了什么?

select 99.foo 

它表现一样

select 99 as foo 

select foo = 99 

此外,它只会出现与整数工作。

+0

有趣; SELECT $ .foo将返回0.00 – mg1075 2011-02-09 23:50:40

回答

7

select 99.foo被译为select 99. as foo(你可以离开了别名前的空格),选择'99“。作为numeric。由于小数点后没有数字,它只显示'99'。

可以通过运行证实了这一点:

select sql_variant_property(99., 'BaseType') 

返回numeric

这是不是select 99 as foo相同,它确实选择'99',但是作为int。这可以通过捉迷藏予以确认:

select sql_variant_property(99, 'BaseType') 

返回int

尽管所有三个查询看起来都是相同的,但第一个与返回值类型中的下两个查询不同。

1

'AS'是可选的,所以select 99 foo的作品。

追尾期间被解释为“零点”,因此select 99. foo也可以使用。

而且值和别名之间不一定有空格,所以select .99foo也适用。

这些也行:

select 99foo 

select 'ninetynine'foo 
0

您可以编写SELECT col AS name使col列返回名称name。允许省略AS,这意味着SELECT col name是同样的事情,但它也可以省去它们之间的空间。在你的例子中,99.是数字99,而foo是列名。在$.foo示例中,$.MONEY值为0的字面值,这就是输出为0.00的原因。

0

显然令人困惑的部分大概是。在99之后,这使得它看起来像是在查询一个属于99的对象的字段。

就真的是不可思议,你可以做

SELECT 99foo 

SELECT 99AS foo 

这两个工作(并给予一列叫做foo的一个int)。使用示例。似乎返回各种数字。 我会说解析器试图变得聪明。如果您的数据是非数字字段类型之一,那么您会将数据封装在撇号中,因此您的意思是数字。因此,任何不是数字的东西都被用来推断别名。