导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

是否可以屏蔽‘警告: 聚合或其它 SET 操作消除了空值。’一类警告信息?

selectplayer 2007-12-13 09:03:21
由于不希望向执行存储过程的delphi程序返回警告信息,所以请教高手:是否有可能在存储过程中进行设置,让严重级别在11以下的警告信息不报告。当然修改存储过程,使之不出现‘警告: 聚合或其它 SET 操作消除了空值。’信息应该是最佳方法,但这不是我要的答案。
...全文
447 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
selectplayer 2007-12-13
'潇洒老乌龟'给了我要的答案。谢谢!
回复
selectplayer 2007-12-13
说明一下,isnull(,'')方法自然可以,但是问题是修改量太大,必须确定各类型字段的空值含义,还有影响索引使用。这不是我要的答案。我就是不想要警告信息,严重级别在10以上的错误信息还是要的!
回复
dawugui 2007-12-13
SET ANSI_WARNINGS
指定几种错误情况下的 SQL-92 标准行为。

语法
SET ANSI_WARNINGS { ON | OFF }

注释
SET ANSI_WARNINGS 影响以下情况:

当设置为 ON 时,如果聚合函数(如 SUM、AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP 或 COUNT)中出现空值,将生成警告信息。当设置为 OFF 时,不发出警告。


当设置为 ON 时,被零除错误和算术溢出错误将导致回滚语句并生成错误信息。当设置为 OFF 时,被零除错误和算术溢出错误将导致返回空值。如果在 character、Unicode 或 binary 列上尝试执行 INSERT 或 UPDATE 操作,而这些列中的新值长度超出最大列大小,则被零除错误和算术溢出错误将导致返回空值。如果 SET ANSI_WARNINGS 为 ON,则按 SQL-92 标准的指定将取消 INSERT 或 UPDATE。将忽略字符列的尾随空格,忽略二进制列的尾随零。当设置为 OFF 时,数据将剪裁为列的大小,并且语句执行成功。


说明 在 binary 或 varbinary 数据转换中发生截断时,不管 SET 选项的设置是什么,都不发出警告或错误信息。

可以使用 sp_configure 的 user options 选项,为与服务器的所有连接设置 ANSI_WARNINGS 的默认设置。有关更多信息,请参见 sp_configure 或设置配置选项。

创建或操作索引视图或计算列上的索引时,SET ANSI_WARNINGS 必须为 ON。如果 SET ANSI_WARNINGS 为 OFF,计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息,请参见 SET 中的"使用 SET 语句时的注意事项"。

Microsoft® SQL Server™ 包含 ANSI warnings 数据库选项,该选项等同于 SET ANSI_WARNINGS。当 SET ANSI_WARNINGS 为 ON 时,如发生被零除、字符串超出数据库列及其它类似错误,将产生错误信息或警告。当 SET ANSI_WARNINGS 为 OFF 时,不产生这些错误和警告。model 数据库中的 SET ANSI_WARNINGS 默认值是 OFF。如果未指定,则应用 ANSI warnings 设置。如果 SET ANSI_WARNINGS 为 OFF,SQL Server 将使用 sp_dboption 的 ANSI warnings 设置。有关更多信息,请参见 sp_dboption 或设置数据库选项。

在执行分布式查询时应将 ANSI_WARNINGS 设置为 ON。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_WARNINGS 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接前在应用程序中设置)中进行配置。对来自 DB-Library 应用程序的连接,SET ANSI_WARNINGS 默认为 OFF。

当 SET ANSI_DEFAULTS 为 ON 时,将启用 SET ANSI_WARNINGS。

SET ANSI_WARNINGS 的设置是在执行或运行时设置,而不是在分析时设置。

如果 SET ARITHABORT 或 SET ARITHIGNORE 为 OFF,并且 SET ANSI_WARNINGS 为 ON,则当遇到被零除或溢出错误时,SQL Server 仍返回错误信息。

权限
SET ANSI_WARNINGS 权限默认授予所有用户。

示例
下例演示 SET ANSI_WARNINGS 为 ON 和 OFF 时的上述三种情况。

USE pubs
GO
CREATE TABLE T1 ( a int, b int NULL, c varchar(20) )
GO
SET NOCOUNT ON
GO
INSERT INTO T1 VALUES (1, NULL, '')
INSERT INTO T1 VALUES (1, 0, '')
INSERT INTO T1 VALUES (2, 1, '')
INSERT INTO T1 VALUES (2, 2, '')
GO
SET NOCOUNT OFF
GO

PRINT '**** Setting ANSI_WARNINGS ON'
GO

SET ANSI_WARNINGS ON
GO

PRINT 'Testing NULL in aggregate'
GO
SELECT a, SUM(b) FROM T1 GROUP BY a
GO

PRINT 'Testing String Overflow in INSERT'
GO
INSERT INTO T1 VALUES (3, 3, 'Text string longer than 20 characters')
GO

PRINT 'Testing Divide by zero'
GO
SELECT a/b FROM T1
GO

PRINT '**** Setting ANSI_WARNINGS OFF'
GO
SET ANSI_WARNINGS OFF
GO

PRINT 'Testing NULL in aggregate'
GO
SELECT a, SUM(b) FROM T1 GROUP BY a
GO

PRINT 'Testing String Overflow in INSERT'
GO
INSERT INTO T1 VALUES (4, 4, 'Text string longer than 20 characters')
GO

PRINT 'Testing Divide by zero'
GO
SELECT a/b FROM T1
GO
DROP TABLE T1
GO

回复
chuifengde 2007-12-13
set ansi_warnings off
回复
dawugui 2007-12-13
http://topic.csdn.net/t/20040229/19/2789325.html
回复
中国风 2007-12-13
楼主说的应该是结果集的列有空值,这个与设置无关
回复
中国风 2007-12-13
在开发中常遇到,在存储过程里转换一下空值为空字符
回复
dawugui 2007-12-13
应该可以,使用某个开关屏蔽信息.

我找找先.
回复
中国风 2007-12-13
isnull(null,'')--空字符
回复
中国风 2007-12-13
有null时 isnull(,'')--转换一下
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告