我今天在运行同事的脚本时看到了上面的“ANSI 警告”消息(我不知道许多语句中的哪一个导致显示警告)。
过去我忽略了它:我自己避免空值,所以任何可以消除它们的东西在我的书中都是一件好事!然而,今天“SET”这个词对我大喊大叫,我意识到我不知道这个词在这种情况下应该是什么意思。
基于它是大写的事实,我的第一个想法是它指的是SET
关键字并且意味着“分配”,如
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
根据 SQL Server 帮助,“ANSI 警告”功能基于 ISO/ANSI SQL-92,该规范仅在小节标题中使用了术语“设置操作”,因此在标题情况下,在数据分配部分。但是,在快速搜索错误消息后,我看到了一些示例,这些示例是SELECT
看似不涉及分配的查询。
我的第二个想法是,基于 SQL Server 警告的措辞,set 的数学含义是隐含的。但是,我不认为 SQL 中的聚合严格来说是一个集合操作。即使 SQL Server 团队认为它是一个集合操作,将“集合”这个词放在大写字母的目的是什么?
在谷歌搜索时,我注意到一条 SQL Server 错误消息:
Table 'T' does not have the identity property. Cannot perform SET operation.
此处相同情况下的“SET操作”一词只能指IDENTITY_INSERT
属性的赋值,这让我回到了我的第一个想法。
任何人都可以对此事有所了解吗?
我只是在浏览SQL-92 规范,看到一段让我想起了这个问题。
事实上,对于这种情况有一个规定的警告,如下所示
我假设
SET
SQL Server 错误消息中的 是对该错误消息的 set 函数的引用,尽管我不确定为什么它会区分聚合和其他 set 函数,据我所知它们是同义词。语法的相关位如下。快速回答
“其他 SET* 可能与较旧的 SQL Server 版本有关。
当我使用 SQL Server 6.5 和 7 时,我以前经常看到它,我敢肯定,但已经有一段时间了。消除了许多怪癖 + SQL Server 更加遵循标准
更长:
如今,消息由
SET ANSI_WARNINGS
默认为ON
.这纯粹与是否
一个例子:
给
另一个例子:
就个人而言,我忽略了警告并将 SET ANSI_WARNINGS 保留为 ON,因为将其设置为 OFF 对计算列和索引视图的其他后果。
最后,可能有一个触发器或计算列或索引视图在某处生成此警告
警告的另一面是指“设置”操作而不是“设置”操作——对我来说这看起来像是一个消息错误——例如它也是用窗口函数产生的: