如何解决此错误“将数据类型 nvarchar 转换为浮点数”. 使用存储过程在SQL中插入记录时

本文关键字:浮点数 存储过程 记录 插入 SQL 转换 nvarchar 解决 何解决 错误 将数据类型 | 更新日期: 2023-09-27 18:36:16

我收到错误

将数据类型 nvarchar 转换为浮点数时出错。

使用我的存储过程将记录插入表中时。

我的存储过程是

ALTER proc [vipl-user].[SP_Copy_Bill_InsertData]
    (@tablename nvarchar(50)  ,
     @INV_NO nvarchar(50),
     @AC_NO nvarchar(50),
     @AC_NAME nvarchar(255),
     @INV_DATE nvarchar(50),
     @AD1 nvarchar(255),
     @AD2 nvarchar(255),
     @AD3 nvarchar(255),
     @AD4 nvarchar(255),
     @AD5 nvarchar(255),
     @AD6 nvarchar(255),
     @TERMS nvarchar(30),
     @EXCHANGE_RATE float,
     @CREATED_BY nvarchar(10),
     @DATE_CREATED nvarchar(50),
     @ZERO_RATED_INV bit,
     @TAX_INCLUDE bit,
     @Deleted bit,
     @SEAL_NO nvarchar(50),
     @JOB_NO nvarchar(255),
     @Inv_Amt nvarchar(50),
     @GST nvarchar(50),
     @Inv_Net nvarchar(50),
     @Status nvarchar(50)) 
as
begin
    Declare @sql nvarchar(max)
    set @sql = 'insert into '+@tablename+'([INV_NO],[AC_NO],[AC_NAME],[INV_DATE],[AD1],[AD2],[AD3],[AD4],[AD5],[AD6],[TERMS],[EXCHANGE_RATE],[CREATED_BY],[DATE_CREATED],[ZERO_RATED_INV],[TAX_INCLUDE],[Deleted],[SEAL_NO],JOB_NO,Inv_Amt,GST,Inv_Net,Status) values ('''+@INV_NO+''','''+@AC_NO+''','''+@AC_NAME+''','+CAST(@INV_DATE as varchar(50))+','''+@AD1+''','''+@AD2+''','''+@AD3+''','''+@AD4+''','''+@AD5+''','''+@AD6+''','''+@TERMS+''','''+CAST(@EXCHANGE_RATE as float)+''','''+@CREATED_BY+''','+CAST(@DATE_CREATED as varchar(50))+','+CAST(@ZERO_RATED_INV as CHAR(1))+','+CAST(@TAX_INCLUDE as CHAR(1))+','+CAST(@Deleted as CHAR(1))+','''+@SEAL_NO+''','''+@JOB_NO+''','+CAST(@Inv_Amt as decimal)+','+CAST(@GST as decimal)+','+CAST(@Inv_Net as decimal)+','''+@Status+''')'
    exec(@sql)
    end

我正在 3 层做我的项目,我已经将 BEL 中的汇率字段作为浮点数/十进制。

请您解决此错误。

如何解决此错误“将数据类型 nvarchar 转换为浮点数”. 使用存储过程在SQL中插入记录时

这样将所有@variables投射到VARCHAR

set @sql='insert into '+@tablename+'([INV_NO],[AC_NO],[AC_NAME],[INV_DATE],[AD1],[AD2],[AD3],[AD4],[AD5],[AD6],[TERMS],[EXCHANGE_RATE],[CREATED_BY],[DATE_CREATED],[ZERO_RATED_INV],[TAX_INCLUDE],[Deleted],[SEAL_NO],JOB_NO,Inv_Amt,GST,Inv_Net,Status) values ('''+@INV_NO+''','''+@AC_NO+''','''+@AC_NAME+''','''+CAST(@INV_DATE as varchar(50))+','''+@AD1+''','''+@AD2+''','''+@AD3+''','''+@AD4+''','''+@AD5+''','''+@AD6+''','''+@TERMS+''','''+CAST(@EXCHANGE_RATE as varchar(50)+''','''+@CREATED_BY+''','''+CAST(@DATE_CREATED as varchar(50))+','''+CAST(@ZERO_RATED_INV as varchar(50)+','''+CAST(@TAX_INCLUDE as varchar(50)+','''+CAST(@Deleted as varchar(50)+','''+@SEAL_NO+''','''+@JOB_NO+''','''+CAST(@Inv_Amt as varchar(50)+','''+CAST(@GST as varchar(50)+','''+CAST(@Inv_Net as varchar(50)+','''+@Status+''')'

这是因为您已经声明了@SQL as VARCHAR(MAX),因此当@SQLEXEC(@SQL) 中执行时,整个查询必须在 VARCHAR 中

另一种方式:

我没有包括所有列,只提供了 2 个列,即EXCHANGE_RATE有浮点数,DATE_CREATED有 nvarchar(50)。您可以修改 sp 并包含所有列,如下所示,以执行动态 sql 插入语句。

declare @paramDefinition nvarchar(max)
set @sql = 'insert into 
    '+@tablename+' ([EXCHANGE_RATE],[DATE_CREATED]) 
    values (@EXCHANGE_RATE,@DATE_CREATED)'
SET @paramDefinition = N'@tablename nvarchar(max),@EXCHANGE_RATE float,@DATE_CREATED nvarchar(50)'
EXECUTE sp_executesql  @sql,@paramDefinition,@tablename,@EXCHANGE_RATE,@CREATED_BY

这样,你就不需要在动态sql插入查询中将每个输入参数强制转换为varchar,并且可以在插入时使用最合适的数据类型。