我有一个为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中运行的任何想法?
答案 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