Sql 我有100美元的数值。当我检查数字时,它返回为1,但我需要将其视为VARCHAR值。 当用户输入如 100美元 >代码> 10000 或 100×或任何此类格式时,我不必将其视为 100美元、 10000 < /代码>或 100版< /代码>的数值。我尝试使用isnumeric,但对于所有这些情况,它都返回1

Sql 我有100美元的数值。当我检查数字时,它返回为1,但我需要将其视为VARCHAR值。 当用户输入如 100美元 >代码> 10000 或 100×或任何此类格式时,我不必将其视为 100美元、 10000 < /代码>或 100版< /代码>的数值。我尝试使用isnumeric,但对于所有这些情况,它都返回1,sql,sql-server,Sql,Sql Server,有人帮忙吗 DECLARE@var varchar(100) 设置@var='$1000' 选择ISNUMERIC(@var) 挑选 案例 当ISNUMERIC(@var)=1时 然后强制转换(@var为数字(36,4)) ELSE强制转换('0'为数字(36,4)) 结束 DECLARE@var varchar(100) 设置@var='$1000' 选择ISNUMERIC(@var) Microsoft SQL Server的ISNUMERIC函数将为货币和其他一些符号(如+和-)返回

有人帮忙吗

DECLARE@var varchar(100)
设置@var='$1000'
选择ISNUMERIC(@var)
挑选
案例
当ISNUMERIC(@var)=1时
然后强制转换(@var为数字(36,4))
ELSE强制转换('0'为数字(36,4))
结束

DECLARE@var varchar(100)
设置@var='$1000'
选择ISNUMERIC(@var)

Microsoft SQL Server的ISNUMERIC函数将为货币和其他一些符号(如+和-)返回true。但是,您的变量仍然是varchar类型。有关更多信息,请参见此处:

看看这篇SO帖子。第一个答案提供了一种解决方法,用于确定数字是否为真正的数字:


您可以使用数据类型Money


如果您使用MS SQL 2012或更高版本,您可以使用
TRY\u CONVERT
TRY\u CAST
功能:

DECLARE @var varchar(100);
SET @var = '$1000';

SELECT 
    ISNULL( TRY_CAST(@var AS numeric(36, 4)), 0 )
如果转换成功,则将值转换为指定的数据类型; 否则,返回null


在开始处理字符串时,您可以尝试一些可能有用的方法

首先,如果您的货币始终是单个字符,则可以检查它是否不是数字,并在使用该值之前将其删除:

declare @var varchar(100) 
set @var = '€1000'
if not(Ascii(Left(@var,1)) between 48 and 57)
    set @var=Replace(@var,Left(@var,1),'')
select @var
如果需要处理多个字符的货币符号,可以使用
子字符串
patindex
的组合来仅获取数字。这并不是特别先进,但假设它只是有史以来唯一的货币价值,则效果很好:

declare @var varchar(100) 
set @var = 'CHF123,456.78'

set @var=Substring(@var, PatIndex('%[0-9]%', @var), Len(@var))
select @var

我假设在用户和数据库之间有一些前端应用程序。你能在值进入数据库之前删除那些货币字符并确保它是一个真实的数值吗?这能回答你的问题吗?您的服务器版本是什么?SQL server的ISNUMERIC函数–它可以正常工作文本和数据,但当包含$%时,它不工作您回答了“如何从可能以非数字字符开头的字符串中解析数字”的问题。OP询问“我如何忽略包含非数字字符的字符串,因为它对我来说是无效的输入”。因此,与你的陈述相反,答案绝对不能解决问题,应该被否决为不相关。目前提出的唯一解决问题的答案是,但即使是这样,也不应该进行投票,因为有人建议使用包含相同解决方案的副本。您好@GSerg,感谢您的澄清-我不反对您的评论,我只想说OP没有明确说出这些话;像许多问题一样,我相信你会特别注意到,经常会有一些含糊不清和不明确的意图,我似乎误解了这一点,对此我深表歉意——如果问题仅仅是“如果输入包含数字/数字以外的任何字符,如何忽略”我绝对会提供一个不同的建议。谢谢你的评论和澄清。这也很有效。谢谢你的回答
declare @var varchar(100) 
set @var = '€1000'
if not(Ascii(Left(@var,1)) between 48 and 57)
    set @var=Replace(@var,Left(@var,1),'')
select @var
declare @var varchar(100) 
set @var = 'CHF123,456.78'

set @var=Substring(@var, PatIndex('%[0-9]%', @var), Len(@var))
select @var