不寻常的T-SQL - 这里发生了什么?

时间:2011-02-09 23:39:13

标签: tsql sql-server-2008

有人可以向我解释一下这个查询的内容吗?

select 99.foo

它的行为与

相同
select 99 as foo

select foo = 99 

此外,它似乎只适用于整数。

4 个答案:

答案 0 :(得分:7)

select 99.foo被翻译为select 99. as foo(因为您可以在别名之前省略空格),选择“99”。作为numeric。由于小数点后面没有数字,它只显示'99'。

您可以通过以下方式确认:

select sql_variant_property(99., 'BaseType')

返回numeric

select 99 as foo相同,后者选择“99”,但选择int。这可以通过runnning确认:

select sql_variant_property(99, 'BaseType')

返回int

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

答案 1 :(得分:1)

'AS'是可选的,因此select 99 foo有效。

尾随句点被解释为“零点”,因此select 99. foo也有效。

并且值和别名之间不一定有空格,因此select .99foo也可以。

这些也有效:

 select 99foo

 select 'ninetynine'foo

答案 2 :(得分:0)

您可以撰写SELECT col AS name以返回名称为col的{​​{1}}列。允许遗漏name,意味着AS是同一个东西,但也允许它们之间留出空间。在您的示例中,SELECT col name是数字99,99.是列名。在foo示例中,$.foo$.值为0的文字,这就是它输出MONEY的原因。

答案 3 :(得分:0)

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

真的很奇怪,你可以做到

SELECT 99foo

SELECT 99AS foo

两者都有效(并在名为foo的列中给出一个int)。使用示例。似乎回归各种数字。 我会说解析器试图变得聪明。如果您认为数据是非数字字段类型之一,那么您将数据包含在撇号中,因此您的意思是数字。因此,任何不是数字的东西都被用来推断别名。