a_h*_*ame 2 sql-server collation
我正在使用以下语句从数据库中检索触发器列表:
select tr.name
from sys.triggers tr
union all
select tr.name
from sys.server_triggers tr;
Run Code Online (Sandbox Code Playgroud)
但是,在我的本地 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;
Run Code Online (Sandbox Code Playgroud)
但是我觉得这是一个丑陋的黑客,我真的不明白为什么首先会发生冲突。两个视图最终都从中检索名称sys.sysschobjs.name,因此所有值都应具有相同的排序规则。
所以我的两个问题是:
collate database_default仅在第二部分使用是否安全,或者我应该更好地将它用于两个查询(性能不是这个问题)。有趣的是,在定义了相同触发器的 SQL Server 2005(标准版)上使用相同的查询时,它不会产生问题。
sys.server_triggers是一个服务器视图,所以它有服务器排序规则。sys.triggers是一个数据库视图,因此它具有数据库排序规则。您有一个与服务器不同的排序规则的数据库。QED。复述:
create database foo collate Latin1_General_CI_AI
use foo
select tr.name
from sys.triggers tr
union all
select tr.name
from sys.server_triggers tr;
Run Code Online (Sandbox Code Playgroud)