【发布时间】:2017-12-09 02:13:15
【问题描述】:
我有一个现有的充满数据的表,可以使用
创建CREATE TABLE __EpisodeCost
(
ActivityRecordID INT NOT NULL,
ActCstID NVARCHAR(15),
VolAmt FLOAT,
ActCnt FLOAT,
TotCst FLOAT,
ResCstID NVARCHAR(50)
);
这来自我无法控制的提要,我想将其转换为我自己的版本,名为 EpisodeCost
CREATE TABLE EpisodeCostCtp
(
ActivityRecordID INT NOT NULL,
ActCstID NVARCHAR(6),
ResCstID NVARCHAR(7),
ActCnt NVARCHAR(7),
TotCst DECIMAL(18, 8)
);
现在,我遇到的问题是转换。我可以执行查询
SELECT
ActivityRecordID,
Cast(ActCstID AS NVARCHAR(6)),
Cast(ResCstID AS NVARCHAR(7)),
Cast(LTRIM(STR(ActCnt, 10)) AS NVARCHAR(7)),
Cast(TotCst AS DECIMAL(18, 8))
FROM __EpisodeCostCtp;
但是,当我尝试执行时,它会提供数据
INSERT INTO EpisodeCostCtp
(
ActivityRecordID,
ActCstID,
ResCstID,
ActCnt,
TotCst
)
SELECT
ActivityRecordID,
Cast(ActCstID AS NVARCHAR(6)),
Cast(ResCstID AS NVARCHAR(7)),
Cast(LTRIM(STR(ActCnt, 10)) AS NVARCHAR(7)),
Cast(TotCst AS DECIMAL(18, 8))
FROM __EpisodeCostCtp;
我明白了
消息 8115,第 16 级,状态 8,第 102 行 将数字转换为数字数据类型的算术溢出错误。 声明已终止。
为什么我可以SELECT 使用相关的转换,但不能INSERT 进入目标表?
编辑。我仍然不完全知道这里发生了什么。
根据 Serg 的建议,我试图定位有问题的记录,但查询
SELECT
ActivityRecordID,
Cast(ActCstID AS NVARCHAR(6)),
Cast(ResCstID AS NVARCHAR(7)),
Cast(LTRIM(STR(ActCnt, 10)) AS NVARCHAR(7)),
Cast(TotCst AS DECIMAL(18, 8))
FROM __EpisodeCostCtp
WHERE TotCst > 9.999999999999999e9;
返回零记录。更改为 9.999999999999999e8 确实如此,并且转换/转换发生时没有错误。我已经将INSERT 查询更改为使用DECIMAL(36, 18),现在插入成功,但我仍然不明智。显然,我的演员阵容受到了限制,但为什么SELECT 有效而INSERT 失败,我仍然不知道。
【问题讨论】:
-
将表作为
__EpisodeCost引入,然后显示两个查询__EpisodeCostCtp的查询有什么意义吗? -
目标表上没有任何触发器?
-
@Damien_The_Unbeliever 不,此时任何一张桌子上都没有 PK/FK。这很简单,从一个表格中选择数据到另一个格式略有不同的表格中。两个表上都没有触发器。
-
您可以尝试在
INSERT之前使用SET NUMERIC_ROUNDABORT OFF:SET ... OFF; INSERT ... SELECT ... FROM...;吗? -
您能否展示一些产生此问题的示例数据? (理想情况下作为插入语句)?我用虚拟数据试了一下,效果很好。
标签: sql sql-server sql-server-2008 type-conversion