如何解决此错误“将数据类型 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 中的汇率字段作为浮点数/十进制。
请您解决此错误。
像
这样将所有@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)
,因此当@SQL
在 EXEC(@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,并且可以在插入时使用最合适的数据类型。