RLH*_*RLH 5 sql t-sql sql-server sql-server-2005
我有一个复杂的数据视图,递归链接和汇总信息.
每天晚上,计划任务运行存储过程,该存储过程从数据视图中选择所有数据,并将其插入表中,以便用户可以比在数据视图上运行select语句更快地查询和分析数据.
父表包含几十万条记录,导出的结果集大小超过1,000,000条记录.
对于大多数夜晚,出口过程没有任何问题,但是,如果用户在我们的主ERP系统中输入了错误的值,它将使夜间进程崩溃,因为其中一个十进制字段将包含一个不适合某些值的值.我必须对数据进行的转换.调试和查找特定的错误字段可能非常困难且耗时.
话虽如此,我已经阅读了两个SQL设置NUMERIC_ROUNDABORT
和ARITHABORT
.这听起来像是解决我的问题的完美选择,但是,我似乎无法让它们使用我的数据视图或存储过程.
我的存储过程只不过是一个TRUNCATE和INSERT语句.我附上......
SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT OFF
Run Code Online (Sandbox Code Playgroud)
......到SP的开头并没有帮助.我认为这是因为技术上错误发生在与数据视图相关的代码中.
接下来,我尝试将两个扩展属性添加到数据视图,希望这可以工作.它没有.
有没有办法可以设置这些SQL属性来忽略舍入错误,以便我可以从数据视图中导出我的数据?
我知道对于我们大多数人来说,作为回答者,我们的第一个倾向是要求代码.然而,在这种情况下,代码非常复杂和专有.我知道修复导致偶尔溢出的定义是最理想的解决方案,但在这种情况下,忽略这些类型的错误要高效得多,因为它们发生在如此罕见的基础上并且很难排除故障.
我该怎么做才能忽略这种行为?
UPDATE
偶然的机会,我相信我可能找到了问题的根本原因,但是,我不知道为什么会发生这种情况.从那时起它就没有了.
通过我的表视图,我有各种计算的字段.由于这些字段需要适合表中定义为decimal (12, 5)
的字段,因此我始终将视图字段语句包装在CAST( ... AS DECIMAL(12, 5))
子句中.
偶然的机会,我偶然发现了一个古怪的东西.我决定看看SSMS如何"看到"我的数据视图.在SSMS对象资源管理器中,我展开了视图 - > [我的视图] -Columns部分,我看到其中一个字段被定义为a decimal (13, 5)
.
我认为我必须在我的一个演员语句中犯了一个错误,但是在遍历表格视图的代码之后,没有decimal(13, 5)
字段的定义?!我唯一的猜测是SSMS看到的视图字段的定义必须从结果数据中导出.但是,我不知道这是怎么发生的,因为我每个领域都有decimal(12, 5)
.
我想知道为什么会这样,但是,我的原始问题仍然存在.我可以在表视图上定义如何以及使用什么SET语句来忽略所有算术溢出并在具有错误数据的字段中写入空值?
最后评论
我已经将HeavenCore的回答标记为答案,因为它确实解决了我的问题,但它没有解决我的根本问题.
经过一些故障排除并试图让我的出口工作,我将不得不尝试不同的方法.即使我将NUMERIC_ROUNDABORT
和ARITHABORT
属性设置为,我仍然无法使导出工作OFF
.
我想ARITHABORT
这是你的朋友。
例如,使用SET ARITHABORT OFF
&SET ANSI_WARNINGS OFF
会将其未能转换的值设为 NULL(而不是抛出异常)
这是一个简单的例子:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl_OverflowExample](
[Value] [decimal](12, 2) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[tbl_OverflowExample] ([Value]) VALUES (CAST(9999999999.00 AS Decimal(12, 2)))
GO
INSERT [dbo].[tbl_OverflowExample] ([Value]) VALUES (CAST(1.10 AS Decimal(12, 2)))
GO
--#### Select data without any casting - works
SELECT VALUE
FROM dbo.tbl_OverflowExample
--#### With ARITHABORT and ANSI warnings disabled - Returns NULL for 999999 but 1.10 as expected
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT CONVERT(DECIMAL(3, 2), VALUE)
FROM dbo.tbl_OverflowExample
GO
--#### With defaults - Fails with overflow exception
SET ARITHABORT ON;
SET ANSI_WARNINGS ON;
SELECT CONVERT(DECIMAL(2, 2), VALUE)
FROM dbo.tbl_OverflowExample
Run Code Online (Sandbox Code Playgroud)
但就我个人而言 - 我更喜欢调试视图并使用一些CASE /.../ END
语句来返回NULL
如果基础值大于目标数据类型 - 这将确保视图正常工作,无论连接选项如何。
编辑:纠正了一些事实错误
归档时间: |
|
查看次数: |
3951 次 |
最近记录: |