我正在使用以下语句从数据库中检索触发器列表:
select tr.name
from sys.triggers tr
union all
select tr.name
from sys.server_triggers tr;
但是,在我的本地 SQL Server 2012 Express 安装中,此操作失败并出现错误:
无法解决 SELECT 语句列 1 中 UNION ALL 运算符中“Latin1_General_CI_AS”和“Latin1_General_CI_AI”之间的排序规则冲突
我可以通过将语句更改为在联合的第二部分中明确使用不同的排序规则来“解决”这个问题:
select tr.name
from sys.triggers tr
union all
select tr.name collate database_default as name
from sys.server_triggers tr;
但是我觉得这是一个丑陋的黑客,我真的不明白为什么会首先发生冲突。两个视图最终都从中检索名称sys.sysschobjs.name
,因此所有值都应具有相同的排序规则。
所以我的两个问题是:
- 为什么首先会有排序规则冲突?
- 仅在第二部分中使用是否安全
collate database_default
,或者我应该更好地将它用于两个查询(性能不是问题)。
有趣的是,相同的查询在针对定义了相同触发器的 SQL Server 2005(标准版)使用时不会产生问题。
sys.server_triggers
是一个服务器视图,所以它有服务器排序规则。sys.triggers
是一个数据库视图,所以它有数据库排序规则。您有一个与服务器具有不同排序规则的数据库。QED。复制: