Pet*_*eed 3 sql sql-server sql-server-2008
我有一个TargetTable有DECIMAL(20, 7)列的目标表.我也有一个SourceTable包含DECIMAL(20, 7)列的源表,但是这个表中的值都是整数.
当我尝试将数据UPSERT成TargetTable从SourceTable通过MERGE声明,我得到一个标准错误.
算术溢出错误将数字转换为数据类型数字.
我真的不明白为什么会发生这种情况,因为两种数据类型都是相同的.
但奇怪的是:当我使用SELECT INTOon TargetTable来创建测试表TestTable,然后将合并的目标更改为TestTable,upsert完成.我也弄不明白为什么会是这样,因为TargetTable和TestTable是大部分相同.
有没有人遇到过这个,这是一个错误,还是有一些我不知道的SQL Server的细微差别?
示例代码:
失败:
SET NUMERIC_ROUNDABORT Off
GO
MERGE
TargetTable Target
USING
(
SELECT
cast(forecast as DECIMAL(20, 7)) forecast
,[SegmentID]
,[Country]
,[Environment]
,[YearColumn]
,[ForecastYear]
,[Criterion]
FROM
SourceTable
) Source
ON
(
Target.SegmentID = Source.SegmentID
AND Target.Country = Source.Country
AND Target.Environment = Source.Environment
AND Target.YearColumn = Source.YearColumn
AND Target.ForecastYear = Source.ForecastYear
AND Target.Criterion = Source.Criterion
)
WHEN NOT MATCHED BY TARGET AND Source.Forecast <> 0 AND Source.Forecast IS NOT NULL THEN
INSERT (SegmentID, Country, Environment, YearColumn, Forecast, ForecastYear, Criterion)
VALUES (Source.SegmentID, Source.Country, Source.Environment, Source.YearColumn, Source.Forecast, Source.ForecastYear, Source.Criterion)
WHEN MATCHED AND (Source.Forecast = 0 OR Source.Forecast IS NULL) THEN
DELETE
WHEN MATCHED AND Source.Forecast <> Target.Forecast THEN
UPDATE SET Target.Forecast = Source.Forecast;
Run Code Online (Sandbox Code Playgroud)
成功:
SELECT
*
INTO
TestTable
FROM
TargetTable
GO
SET NUMERIC_ROUNDABORT Off
GO
MERGE
TestTable Target
USING
(
SELECT
cast(forecast as DECIMAL(20, 7)) forecast
,[SegmentID]
,[Country]
,[Environment]
,[YearColumn]
,[ForecastYear]
,[Criterion]
FROM
SourceTable
) Source
ON
(
Target.SegmentID = Source.SegmentID
AND Target.Country = Source.Country
AND Target.Environment = Source.Environment
AND Target.YearColumn = Source.YearColumn
AND Target.ForecastYear = Source.ForecastYear
AND Target.Criterion = Source.Criterion
)
WHEN NOT MATCHED BY TARGET AND Source.Forecast <> 0 AND Source.Forecast IS NOT NULL THEN
INSERT (SegmentID, Country, Environment, YearColumn, Forecast, ForecastYear, Criterion)
VALUES (Source.SegmentID, Source.Country, Source.Environment, Source.YearColumn, Source.Forecast, Source.ForecastYear, Source.Criterion)
WHEN MATCHED AND (Source.Forecast = 0 OR Source.Forecast IS NULL) THEN
DELETE
WHEN MATCHED AND Source.Forecast <> Target.Forecast THEN
UPDATE SET Target.Forecast = Source.Forecast;
Run Code Online (Sandbox Code Playgroud)
您的代码似乎根本没有错误.此外,当您使用与原始表显示错误不存在的相同结构和数据时,它在您创建另一个表作为目标时工作正常.最可能的原因是您的原始表上有一个触发器正在执行失败的查询,这就是您所看到的错误.
| 归档时间: |
|
| 查看次数: |
1988 次 |
| 最近记录: |