2011-12-22 42 views
3

鑑於:T-SQL確定性INT鑄

  • SQL服務器
  • 表稱爲TEST_TABLE
  • TEST_TABLE列稱爲類型的TEST_FIELDVARCHAR(50) NOT NULL
  • 第1列:10YR3/6
  • 行2 :10YR3/2
  • 查詢:SELECT TEST_FIELD FROM TEST_TABLE WHERE ...

問:

在我這裏條件,我需要在字符串的最後一個字符來測試值。我注意到在Where子句中執行以下操作的相同行爲。

  1. RIGHT(TEST_FIELD,1) > 3
  2. CAST(RIGHT(TEST_FIELD,1) AS INT) > 3

它們是否表現通過一些推斷投相同的情況下,1?案例1是確定性的嗎?

在此先感謝。

馬特

回答

2

當你比如檢查值A轉換完成:

DECLARE @t varchar(100) 

SET @t = (SELECT 'ABCA2') 

SELECT @t  

IF RIGHT(@t, 2) > 10 
    SELECT 'Hi' 
ELSE 
    SELECT 'Bye' 

將拋出一個錯誤,因爲SQL不能轉換A2爲整數而不發出一個錯誤。

SET @t = (SELECT 'ABC12')

上面的代碼將工作作爲轉換是成功的,比較可製成:

但是,如果你更換@t。正確的功能本身不會轉換您的價值。 MSDN規定的RIGHT()明確的返回類型:

返回值VARCHAR當一個character_expression爲非Unicode字符 數據類型。

當character_expression是一個Unicode字符數據時返回nvarchar 類型。

爲了方便自己,消除功能RIGHT()乾脆,當比較與文字做了實例:

DECLARE @t varchar(100) 

SET @t = (SELECT '1') 

SELECT @t 

IF @t < 10 
    SELECT 'Hi' 
ELSE 
    SELECT 'Bye' 

注意我沒有打電話給Right()。上面的結果是顯示1,然後是文本Hi。

+0

所以在我的情況下,我有幾個獨特的值本身。 10YR3/6。 10,3和6.不利用權利會混雜在一起不是嗎? 1036?或更糟10而不是3或6?對這種行爲不確定,所以我的問題仍在繼續。 – 2011-12-22 16:45:49

+0

@MattAkers - 如果你可以解析值分別得到10,3和6,那麼你就沒事了。如果你不能,那麼你的文本與一個整數數據類型的比較將會拋出一個異常。你不能比較10YR3/6和100的值。它不知道如何執行這個操作,這與Right()甚至是Left()沒有任何關係,當比較的時候更多的是與轉換有關已經完成了。這有意義嗎? – JonH 2011-12-22 16:49:20

+0

這很有道理。我完全同意你的例子和評論。我的問題更多地涉及比較轉換何時何地通過/失敗的原因是:爲什麼在第1條和第2條中執行相同的操作,並且如果1似乎在黑盒中執行了投射,我是否真的需要徹底投射它?並且在第1條中有確定性行爲嗎? – 2011-12-22 17:07:51

0

而且情況1是確定性的 - 要麼從字符串成功隱式轉換爲整數(結束然後是兩個整數之間的比較),要麼拋出異常。

+0

謝謝Bako。這就是我一直在尋找的。乾杯! – 2011-12-22 17:11:28