我有一个用于从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
更新
刚刚完成上述代码的测试,它确实有效!
答案 0 :(得分:5)
钱是十进制的,所以你要这样测试
不要开箱即用ISNUMERIC:它不可靠。使用此:
ISNUMERIC(MyCOl + 'e0')
请注意,如果您有6位小数,那么转换为金钱时会丢失
其他问题包含更多信息原因:How to determine the field value which can not convert to (decimal, float,int) in SQL Server
编辑:
如果你想要
,可以在一行中完成ISNUMERIC(REPLACE(REPLACE(@chkCOl, '$', ''), ',', '') + 'e0')