2011-02-09 87 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)。使用示例。似乎返回各種數字。 我會說解析器試圖變得聰明。如果您的數據是非數字字段類型之一,那麼您會將數據封裝在撇號中,因此您的意思是數字。因此,任何不是數字的東西都被用來推斷別名。