SQL Server检查字符串中是否有空格、特殊字符和字符

SQL Server检查字符串中是否有空格、特殊字符和字符,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个报告,它生成一个值列表,这些值都应该是数字,但当前存储为varchar。在我的导出中,我将varchar字符强制转换为Int,但当有人错误地输入字符或特殊字符时,报告将失败,因为它无法转换为Int Current List 557780 558871 5588a6 5588 7 我需要的是将包含空格或字符的值替换为错误int,如99999999,这样最终结果将是 557780 558871 99999999 99999999 我知道我可以用这样的方法来做 CASE WHEN Some

我有一个报告,它生成一个值列表,这些值都应该是数字,但当前存储为varchar。在我的导出中,我将varchar字符强制转换为Int,但当有人错误地输入字符或特殊字符时,报告将失败,因为它无法转换为Int

Current List
557780
558871
5588a6
5588 7
我需要的是将包含空格或字符的值替换为错误int,如99999999,这样最终结果将是

557780
558871
99999999
99999999
我知道我可以用这样的方法来做

CASE WHEN SomeNum LIKE '%_%' THEN 99999999 ELSE SomeNum
     WHEN SomeNum LIKE '%a%' THEN 99999999 ELSE SomeNum END

但是,有没有更好的方法来分别比较每封信和特殊租船人呢?

您可以使用DoItWith模式

case when SomeNum NOT LIKE '%[^0-9]%' THEN 99999999 ELSE cast(SomeNum as int) END

您可以使用Doit with pattern

case when SomeNum NOT LIKE '%[^0-9]%' THEN 99999999 ELSE cast(SomeNum as int) END

如果您在中或更高版本,可以使用
ISNUMERIC
。注意,这将匹配货币和小数等。如果您只是寻找整数,那么您需要正则表达式。看雷达的回答

他们的例子是为了完整性:

USE AdventureWorks2012;
GO
SELECT City, PostalCode
FROM Person.Address 
WHERE ISNUMERIC(PostalCode)<> 1;
GO
使用AdventureWorks2012;
去
选择城市、邮政编码
个人地址
其中为数字(后代码)1;
去

如果您是SQL Server 2008之前的版本,则可以将Radar的答案与正则表达式一起使用。如果您是SQL Server 2008或更高版本,则可以使用
ISNUMERIC
。注意,这将匹配货币和小数等。如果您只是寻找整数,那么您需要正则表达式。看雷达的回答

他们的例子是为了完整性:

USE AdventureWorks2012;
GO
SELECT City, PostalCode
FROM Person.Address 
WHERE ISNUMERIC(PostalCode)<> 1;
GO
使用AdventureWorks2012;
去
选择城市、邮政编码
个人地址
其中为数字(后代码)1;
去

如果您是SQL Server 2008之前的版本,您可以将Radar的答案与正则表达式一起使用,您可以在SQL 2012+上尝试这一点:

SELECT COALESCE(TRY_CONVERT(INT, SomeNum), 99999999) AS Value
FROM YourTable

您可以在SQL 2012+上尝试此操作:

SELECT COALESCE(TRY_CONVERT(INT, SomeNum), 99999999) AS Value
FROM YourTable

哪个版本的SQL Server?哪个版本的SQL Server?我尝试了这个,但仍然得到相同的错误转换Failed@ScholarYoshi,您需要在else cast中执行cast(someNum作为int)我尝试了这个,但仍然得到相同的错误转换Failed@ScholarYoshi,您需要在其他cast中执行cast(someNum作为int)谢谢!这正是我需要的。谢谢!这正是我需要的。