在存储过程中将 varchar 转换为数字时出错

Posted

技术标签:

【中文标题】在存储过程中将 varchar 转换为数字时出错【英文标题】:Error converting varchar to numeric in Stored Procedure 【发布时间】:2020-03-10 10:22:46 【问题描述】:

我正在尝试将记录从 XML 文件插入到 SQL Server 表中。 XML 文件有一些 Depth 列的条目,其值与 ex 略有不同。 -8.67991800817151E-0

有人可以指导我如何将该值转换为十进制并插入到表格中吗?谢谢。

这是我的存储过程:

CREATE PROCEDURE [dbo].[IProjectData]   
    @xml XML
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO DHDStrainSet 
        SELECT
            DHDStrainSet.value('(StrainID/text())[1]','VARCHAR(255)') AS StrainID,
            DHDStrainSet.value('(Depth/text())[1]','decimal(18,3)')  AS Depth,
            DHDStrainSet.value('(Strain/text())[1]','decimal(18,10)') AS Strain,
            DHDStrainSet.value('(ProjectID/text())[1]','VARCHAR(50)') AS ProjectID
        FROM
            @xml.nodes('/RSM3DDB/DHDStrainSet') AS TEMPTABLE(DHDStrainSet)
END

示例 XML 文件是:

<?xml version="1.0" standalone="yes"?>
<RSM3DDB>
  <DHDStrainSet>
    <StrainID>SB 1_1ef50386</StrainID>
    <Depth>-5.001987E-9</Depth>
    <Strain>0.99</Strain>
    <ProjectID>Hoop</ProjectID>
  </DHDStrainSet>
</RSM3DDB>

【问题讨论】:

如果您提供一个示例 xml,将会有所帮助。 嗨,jonathan,我已经用示例 xml 文件编辑了问题,其中有一个条目供您参考。 @Çöđěxěŕ 你能解释一下我该怎么做吗? @Shital 这不是有效的 xml,请您更新一下。 @Çöđěxěŕ 我已经更新了 【参考方案1】:

XML 文件中有一些用于深度列的条目,其值与 ex 的值略有不同。 -8.67991800817151E-0。有人可以指导我如何将该值转换为十进制吗?

查看值-8.67991800817151E-0 无法转换为decimal,您需要考虑将其转换为float

所以这一行:

 DHDStrainSet.value('(Depth/text())[1]','decimal(18,3)')  AS Depth,

需要更改为(将修复错误):

 DHDStrainSet.value('(Depth/text())[1]','float') AS Depth,

所以在你所说的所有你想要一个decimal(10,3) 中,你可以将该值转换为一个decimal(10,3),例如:

 convert(decimal(10,3), DHDStrainSet.value('(Depth/text())[1]','float'))  AS Depth,

这将输出:-8.68

【讨论】:

以上是关于在存储过程中将 varchar 转换为数字时出错的主要内容,如果未能解决你的问题,请参考以下文章

SQL表单提示"从数据类型varchar转换为int时出错"

将数据类型 varchar 转换为数字时出错。插入语句[重复]

SQL Server 2012 将数据类型 varchar 转换为数字时出错

在oracle中将varchar2转换为数字

将 varchar 转换为数字数据类型时出现算术溢出错误。找不到存储过程''。?

如何在存储过程中将数字转换为字符串[关闭]