2009-06-25 29 views
30

MS SQL服務器中是否有任何「轉換」功能可以安全地轉換類型(不會引發異常)。我需要像C#lang中的「tryParse」,但作爲SQL語句。MS SQL服務器毫不例外地轉換

更詳細的,我需要下面的語句返回零或任何其他,但拋出異常。

選擇轉換(浮動, 'fjsdhf')

在此先感謝。

回答

8

您可以測試一個值是數字與TSQL函數ISNUMERIC()

http://msdn.microsoft.com/en-us/library/ms186272.aspx

而且,如果你是不是已經意識到這一點,TSQL現在有一個TRY CATCH構造。

http://msdn.microsoft.com/en-us/library/ms179296.aspx

+0

TRY CATCH不適合我的解決方案,因爲我有限且無法添加額外的語句。我認爲增加額外的功能,將安全鑄造。就像「myconvert(類型,數據,默認值)」,我想知道是否有另一種方法可以讓我將自定義函數添加到數據庫中。 – AndrewG 2009-06-25 10:03:38

+1

TRY..CATCH +1 - 這真的是要走的路! – 2009-06-25 10:40:26

3

如果SQL的版本你是使用支持的CLR,你可以寫的TryParse風格的方法。\ 它不符合你添加自定義功能的分貝,雖然標準。但它可能會比SQL UDF更快。

[SqlFunction] 
public static SqlDouble TryParseDouble(SqlString str) 
{ 
    Double d; 
    bool success = Double.TryParse(str, out d); 
    if (!success) 
    return SqlDouble.Null; 
    return new SqlDouble(d); 
} 
34

這將默認的非數值運算到0,且不需要另一份聲明:

SELECT CASE 
    WHEN ISNUMERIC(myvarcharcolumn)=1 THEN 
     CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.')) 
    ELSE 0 END AS myfloatcolumn 

的REPLACE()函數調用來改變逗號週期。逗號在某些文化中被用作小數點分隔符(例如,「1.25」而不是「1.25」),但除非您的服務器設置了其中一個作爲默認文化,否則ISNUMERIC()將返回1,但CONVERT( )會拋出一個錯誤。這確實意味着您的字符串不應該使用逗號作爲數千個分隔符,但在大多數情況下,逗號爲小數位佔位符更可能是小數位佔位符。因爲ISNUMERIC()將返回1爲帶有前導或尾隨空格的字符串,但CONVERT()不能處理它們。所以,你必須修剪你的琴絃。

唯一剩下的潛在問題是如果數字可以表示爲int,貨幣,小數或浮點數,但只轉換爲浮點數,ISNUMERIC()將返回1。實際上,一個float可以存儲你所拋出的任何東西,但是如果你試圖轉換爲int,ISNUMERIC()會返回1,例如「2.5」,但CONVERT(int,'2.5')會返回1仍然拋出一個錯誤。

12

在SQL Server 2012中也有新的功能來處理這個

try_cast try_convert try_parse

0

FWIW,考慮到這個問題,幾乎是6歲:在SQL Server 2012你可以使用TRY_CONVERT將返回NULL錯誤;這可能正是你想要的。