SQL Server 2008 R2 Express中的try_convert

时间:2014-03-26 21:30:40

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我有一个为SQL Server 2012编写的查询,并使用try_convert()函数。我现在需要在SQL Server 2008 R2 Express上执行查询,我理解{2008年R2中try_convert()不是受支持的函数。

我当前的查询包含此块:

CASE WHEN (try_convert(decimal, tew_userdata_locTo.use_data0) IS NULL) 
THEN .. ELSE .. END

这给了我一个真或假的结果,让我知道我是否可以将特定值转换为小数。如果我可以转换价值,我会这样做。如果没有,我使用默认的十进制值并继续使用。

关于我可以编写哪些可以在SQL Server 2008 R2中运行的任何想法?

3 个答案:

答案 0 :(得分:1)

try_convert()尝试进行转换。这是处理转换错误的一种很好的方法(或者至少比SQL Server以前做的更好,这没什么)。您可以使用like查看字符串“看起来”是否有效小数。这是一次尝试:

CASE WHEN tew_userdata_locTo.use_data0 not like '%[^0-9.]%' and
          tew_userdata_locTo.use_data0 not like '%.%.%'
     THEN convert(decimal, tew_userdata_locTo.use_data0)
THEN .. ELSE .. END

答案 1 :(得分:0)

我编写了一个有用的标量函数来模拟SQL Server 2008中SQL SERVER 2012的TRY_CAST函数。

output: {
  path: helpers.root('dist'),
  publicPath: 'https://mycdn.com/',
  // other config goes here
}
  

与SQL Server 2012的TRY_CAST功能的两个主要区别在于您必须传递3个参数   必须另外对该字段执行显式CONVERT或CAST。   但是,它仍然非常有用,因为它允许你返回一个   如果未正确执行CAST,则为默认值。

功能代码:

dbo.TRY_CAST(Expression, Data_Type, ReturnValueIfErrorCast)

目前仅支持数据类型 INT,DATE,NUMERIC,BIT和FLOAT 。您可以在下面的下一个链接中找到此代码的最后一个版本,我们互相帮助以改进它。 SQL Server 2008的TRY_CAST函数 https://gist.github.com/jotapardo/800881eba8c5072eb8d99ce6eb74c8bb

答案 2 :(得分:0)

另一个解决方案是使用CLR程序集。这允许“链接”用C#或VB编写的函数,这些函数的运行速度比任何SQL等效函数快得多。

以下article介绍了如何在专业版Visual Studio中创建CLR程序集。但是,这可以由任何其他版本(即社区)作为类库创建,并在数据库程序集中手动注册。

对于当前问题,只需使用以下类进行检查:

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean IsDecimal(string value)
{
    decimal decValue;
    bool isNumeric = decimal.TryParse(value, out decValue);
    return new SqlBoolean(isNumeric);
}

用法示例:

select dbo.IsDecimal(1.0) --> 1
select dbo.IsDecimal(1.0a) --> 0

-- quick and dirty performance test -> takes about 2 seconds (250K records)
-- as opposed to about 1 second of just selecting the data without any filter 
select * from sys.messages where dbo.IsDecimal(severity) = 1