在SQL Server 2008中,如何检查varchar参数是否可以转换为数据类型钱?

Pat*_*hes 3 sql sql-server currency sql-server-2008

我有一个存储过程用于从csv插入数据.数据本身是各种类型,一些测试,一些日期和一些货币领域的混合.我需要保证这些数据得到保存,即使它的格式错误,所以,我将它们全部保存到varchars中.稍后,一旦数据被验证并检查完毕,它将被移动到具有适当数据类型的另一个表.

当我插入第一个表时,我想做一个检查,如果需要注意,在行上设置一个标志(位列).例如,如果钱号中应该包含字母,我需要标记该行并在我得到的额外errormsg字段中添加列名.然后,我可以使用该标志来查找并突出显示界面中用户需要编辑的字段.

日期参数似乎很简单,我可以IF ISDATE(@mydate) = '0'用来测试该参数是否可以从varchar转换为datetime.但是,我似乎无法找到ISMONEY()或任何远程等效的东西.

如果varchar的内容可以合法地转换为金钱,有谁知道要测试什么?

编辑: 我还没有测试过,但你怎么看待这样的功能?:

CREATE FUNCTION CheckIsMoney 
(
   @chkCol varchar(512)
)
RETURNS bit
AS
BEGIN
 -- Declare the return variable here
 DECLARE @retVal bit

SET @chkCol = REPLACE(@chkCol, '$', '');
SET @chkCol = REPLACE(@chkCol, ',', '');

IF (ISNUMERIC(@chkCOl + 'e0') = '1')
    SET @retVal = '1'
ELSE
    SET @retVal = '0'

RETURN @retVal

END
GO
Run Code Online (Sandbox Code Playgroud)

更新

刚刚完成上面的代码测试,它的工作原理!

gbn*_*gbn 5

钱是十进制的,所以你这样测试

不要开箱即用ISNUMERIC:它不可靠.用这个:

ISNUMERIC(MyCOl + 'e0')
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有6位小数,则转换为金钱时将丢失

其他问题更多信息原因:如何确定SQL Server中无法转换为(decimal,float,int)的字段值

编辑:

如果你愿意,可以在一行中完成

ISNUMERIC(REPLACE(REPLACE(@chkCOl, '$', ''), ',', '') + 'e0')
Run Code Online (Sandbox Code Playgroud)

  • 钱可以接受货币符号,所以这可能会不公平地返回0,例如`select ISNUMERIC('$ 4.10e0'),CONVERT(money,'$ 4.10') (3认同)