下面的代码演示了如何使用标准插入语句将具有精度的十进制值插入bigint列。 SqlServer截断精度,但不会抛出错误来通知DBA。
CREATE TABLE [dbo].[TableX]
(
[ColumnA] [bigint] NULL
);
SET NUMERIC_ROUNDABORT ON;
SET XACT_ABORT ON;
insert into [dbo].[TableX] (ColumnA)
select 999999999.99;
select * from [dbo].[TableX]
-- output ==> 999999999 (precision missing) -- no error thrown?
问题:
予。你能解释为什么精度会丢失并且没有抛出错误吗?
II。你可以建议一种强制SQLServer在这种情况下抛出错误的方法吗?
注意: 当批量精度将丢失时,SQL批量插入在尝试将小数转换为bigint时会引发错误,所以我相当肯定必须有一种方法可以使用标准插入语句来实现这一点。根据示例代码。
答案 0 :(得分:1)
您的第一个问题的答案是它是按设计的:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
因此,对于第二个问题,您需要添加一些检查十进制值的逻辑,并以您需要的方式处理它们。
关于批量插入的最后一点 - 我不是百分之百,所以很乐意接受建议 - 我相信这是因为SQL Server不知道你的平面文件中的数据类型是什么,所以一切都是字符串。然后,您可以声明它应该转换为R.id.subject_spinner_name
或date
,SQL将尝试转换。
从字符串到int
和decimal
数据类型的转换要严格得多,这就是为什么int
会引发错误的原因,如下所示:
bulk insert