MS SQL服務器中是否有任何「轉換」功能可以安全地轉換類型(不會引發異常)。我需要像C#lang中的「tryParse」,但作爲SQL語句。MS SQL服務器毫不例外地轉換
更詳細的,我需要下面的語句返回零或任何其他,但拋出異常。
選擇轉換(浮動, 'fjsdhf')
在此先感謝。
MS SQL服務器中是否有任何「轉換」功能可以安全地轉換類型(不會引發異常)。我需要像C#lang中的「tryParse」,但作爲SQL語句。MS SQL服務器毫不例外地轉換
更詳細的,我需要下面的語句返回零或任何其他,但拋出異常。
選擇轉換(浮動, 'fjsdhf')
在此先感謝。
您可以測試一個值是數字與TSQL函數ISNUMERIC()
http://msdn.microsoft.com/en-us/library/ms186272.aspx
而且,如果你是不是已經意識到這一點,TSQL現在有一個TRY CATCH構造。
如果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);
}
這將默認的非數值運算到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仍然拋出一個錯誤。
在SQL Server 2012中也有新的功能來處理這個
try_cast try_convert try_parse
FWIW,考慮到這個問題,幾乎是6歲:在SQL Server 2012你可以使用TRY_CONVERT
將返回NULL錯誤;這可能正是你想要的。
TRY CATCH不適合我的解決方案,因爲我有限且無法添加額外的語句。我認爲增加額外的功能,將安全鑄造。就像「myconvert(類型,數據,默認值)」,我想知道是否有另一種方法可以讓我將自定義函數添加到數據庫中。 – AndrewG 2009-06-25 10:03:38
TRY..CATCH +1 - 這真的是要走的路! – 2009-06-25 10:40:26