2010-12-09 62 views
2

我有這樣一個SQL查詢與數值型字段

CREATE TABLE MyTable (
    [MyTableID] [int] NOT NULL, 
    [Description] [varchar](50) NOT NULL, 
    CONSTRAINT [PK_AddressType] PRIMARY KEY CLUSTERED (
     [MyTableID] ASC 
    ) 
) ON [PRIMARY] 

表有人能解釋爲什麼下面的查詢工作,即使我包括單引號內的字段值?

SELECT * 
FROM MyTable 
WHERE MyTableID = '1' 

這是SQL Server特有的功能嗎?它是ANSI/SQL?

回答

6

您演示的內容通常被稱爲隱式數據轉換 - 數據會自動轉換爲與之比較的列的數據類型。因爲具有值「1」的字符串可以轉換爲值爲1的數字數據類型,所以事情工作得很好。隱式數據類型轉換可以根據此處的precedence list進行。

顯式數據轉換是當您使用像CAST or CONVERT這樣的函數時。

字符串到數字(反之亦然)在我所知的所有數據庫上都支持 - SQL Server,Oracle,MySQL,PostgreSQL ... CAST函數是ANSI,IIRC。其他數據類型不那麼靈活 - 例如日期時間&。

+0

這種隱式數據轉換特定於SQL Server嗎?我幾乎可以肯定的是,查詢將會對Oracle和DB2失敗 – Lorenzo 2010-12-09 01:07:20

+0

@Lorenzo:我在更新的同時發表評論,但沒有 - 它不是特定於SQL Server的。 – 2010-12-09 01:08:32

3

除了OMG小馬的答案。

根據此處的precedence list可發生隱式數據類型轉換。

當謂詞中的常量或參數的數據類型的優先級高於列的優先級時,它們可能成爲性能問題的來源。在這種情況下,列值將需要經歷隱式轉換,意味着不能使用索引。