Tsql 开发了奇怪的数据库,它没有键,允许将数字输入varchar,varchar也允许空值

Tsql 开发了奇怪的数据库,它没有键,允许将数字输入varchar,varchar也允许空值,tsql,casting,varchar,Tsql,Casting,Varchar,我如何确保TSQL不会对我咆哮 这些值返回: “1.00000000” 或 无效的 或 '' 或 “一些价值” 如果您使用的是SQL Server 2012或更高版本,当我转换为int时,您可以使用TRY\u convert功能,例如 WITH yourTable AS ( SELECT 123 AS intVal UNION ALL SELECT '123' UNION ALL SELECT NULL ) SELECT intVal, CASE WHE

我如何确保TSQL不会对我咆哮 这些值返回:

“1.00000000” 或 无效的 或 '' 或 “一些价值”


如果您使用的是SQL Server 2012或更高版本,当我转换为int时,您可以使用
TRY\u convert
功能,例如

WITH yourTable AS (
    SELECT 123 AS intVal UNION ALL
    SELECT '123' UNION ALL
    SELECT NULL
)

SELECT
    intVal,
    CASE WHEN TRY_CONVERT(int, intVal) IS NOT NULL THEN 'yes' ELSE 'no' END AS can_parse
FROM yourTable;


在这种情况下,如果无法将输入转换为整数,
TRY\u CONVERT
函数将返回
NULL
。因此,在尝试正式转换或转换之前,这是一种探测数据的安全方法。

以下是我发现的对我有效的答案。。。 由于客户的原因,我不在2012或更高版本上

但不要给我荣誉:)我只擅长寻找对我有用的答案

尽管我将它从返回null改为返回零,因为愚蠢的varchar应该是一个默认值为零的int列:)

这是一个适用于任何真正是VARCHAR而不是int的值的函数 因为VARCHAR实际上是一种可变长度的字符串数据类型

WITH tmpTable AS (
SELECT '123' as intVal UNION ALL
SELECT 'dog' UNION ALL
SELECT '345' UNION ALL
SELECT 'cat' UNION ALL
SELECT '987' UNION ALL
SELECT '4f7g7' UNION ALL
SELECT NULL
)

Tim Biegeleisen对上述答案的认可。。。。 尽管如此,当他的解决方案找到角色时,它将 还是出错了。。。因此发生了变化

SELECT
intVal
,case when intVal not like '%[^0-9]%' then 'yes' else 'no' end FROM tmpTable;