MSSQL:插入查询中出现varchar到float的转换错误



这件事一直困扰着我。

我有一个带有TRY-CATCH的SP,如果它失败,它应该在错误日志表中插入一条带有消息和一些代码的记录。这就是它的样子:

INSERT INTO [Errors]
([application]
,[message]
,[extra])
VALUES
('MySP'
,ERROR_MESSAGE()
,'InvNum=' + str(@inumber) + ' -- InvId=' + str(@IID) + ' -- Error Num: ' + str(ERROR_NUMBER()) + ' -- Error Line: ' + str(ERROR_LINE()))

问题是,每次尝试运行此查询时,都会产生varchar到float的转换错误。这对我来说没有意义,因为最后一列中传递的所有值都被转换为字符串。

知道吗?

不要对多个值使用STR函数,然后使用字符串连接运算符连接字符串,而是使用CONCAT函数。它在传递给它的数据类型方面非常灵活,并且应该产生相同的预期结果。

INSERT INTO [Errors] ([application],[message],[extra])
VALUES (
'MySP'
, ERROR_MESSAGE()
, CONCAT('InvNum=', 
@inumber, 
' -- InvId=', 
@IID, 
' -- Error Num: ',
ERROR_NUMBER(),
' -- Error Line: ',
ERROR_LINE()
)
)

问题是,根据文档,STR函数">返回从数字数据转换而来的字符数据"。换句话说,解析器知道STR函数需要数字参数,所以它试图首先将所有参数转换为浮点,然后STR函数将它们更改为字符串。

就我个人而言,我几乎从来没有因为这样的事情而使用STR函数,相反,我更喜欢使用CAST(.. AS ..)CONVERT(..),因为它们1(不太关心输入数据类型,2(可以根据参数生成任何输出数据类型。因此,我不必担心使用哪个函数将数据类型(A(转换为数据类型(B(,而是始终使用相同的函数(CAST或convert(,只需担心参数是否正确。

是的,CAST和CONVERT确实更笨重、更长、更丑陋,但如果你总是使用CONVERT,你就不必担心CONVERT是如何工作的(而且,CONVERT非常通用,你几乎可以将它用于任何标量类型的转换(。

最新更新