Sql server COLLATE子句不能用于包含COLLATE子句的表达式

Sql server COLLATE子句不能用于包含COLLATE子句的表达式,sql-server,tsql,database-performance,Sql Server,Tsql,Database Performance,我有两张桌子:tab1和tab2。每个表只有一个VARCHARMAX列 我只需要获得那些值对,它们是相等的,但只有在不同的情况下才不同 输入示例: tab1.t1 tab2.t2 ----------------------- fff fff FFF fff Fff fff FFF FFA FfA FFF FFF aaa bbb aaa Related output: t1 t2 -------------------

我有两张桌子:tab1和tab2。每个表只有一个VARCHARMAX列

我只需要获得那些值对,它们是相等的,但只有在不同的情况下才不同

输入示例:

tab1.t1     tab2.t2
-----------------------
fff     fff
FFF     fff
Fff     fff
FFF     FFA
FfA     FFF
FFF     aaa
bbb     aaa

Related output:

t1      t2
-----------------------
fff     FFF
FFF     fff
Fff     fff
Fff     FFF
FfA     FFA
表tab1和tab2在实际数据库中足够大,可以容纳800-1000行。我需要为大约500-600列生成此操作

所以我需要写一个快速的解决方案。 我写了一篇alghoritm:

使用区分大小写的排序规则从tab1中删除所有重复项 使用区分大小写的排序规则从tab2中删除所有重复项 使用不区分大小写的排序规则连接前面步骤中的结果集 使用区分大小写的排序规则筛选出值不相等的WHERE子句行 使用区分大小写的排序规则删除重复行 我试过:

SELECT DISTINCT tt.t1 COLLATE Cyrillic_General_CS_AS, tt.t2 COLLATE Cyrillic_General_CS_AS
FROM (
    SELECT tt1.t1, tt2.t2
    FROM 
    (
        SELECT tab1.t1 COLLATE Cyrillic_General_CS_AS
                       AS t1
        FROM (VALUES('fff'),('FFF'),('Fff'),('FFF'),('FfA'),('FFF'),('bbb')) AS tab1(t1)
        GROUP BY tab1.t1 COLLATE Cyrillic_General_CS_AS
    ) tt1 INNER JOIN
    (
        SELECT tab2.t2 COLLATE Cyrillic_General_CS_AS
                       AS t2
        FROM (VALUES('fff'),('fff'),('fff'),('FFA'),('FFF'),('aaa'),('aaa')) AS tab2(t2)
        GROUP BY tab2.t2 COLLATE Cyrillic_General_CS_AS
    ) tt2
    ON tt1.t1 = tt2.t2 COLLATE Cyrillic_General_CI_AS
) AS tt
WHERE tt.t1 <> tt.t2 COLLATE Cyrillic_General_CS_AS
但如果发生错误:

COLLATE子句不能用于包含COLLATE子句的表达式


请建议我如何在不使用用户定义函数、临时表或删除group by子句的情况下避免此问题。我尝试过这些函数,但它们几乎不会减慢执行速度。

因为SQL Server可以以任何顺序处理联接,并且

将要在最终输出中计算的表达式结转 很早解析表达式,早在从数据中优化到初始检索时解析表达式 它不能保证在哪一阶段它将强制应用校对。因此,您只能将其应用于任何列/表达式一次。因为在外部查询中已经有DISTINCT,所以GROUP BY在派生表中是多余的,即使您觉得它会减少中间结果集的数量

SELECT DISTINCT tt.t1 COLLATE Cyrillic_General_CS_AS, tt.t2 COLLATE Cyrillic_General_CS_AS
FROM (
    SELECT tt1.t1, tt2.t2
    FROM 
        (VALUES('fff'),('FFF'),('Fff'),('FFF'),('FfA'),('FFF'),('bbb')) tt1(t1)
    INNER JOIN
        (VALUES('fff'),('fff'),('fff'),('FFA'),('FFF'),('aaa'),('aaa')) tt2(t2)
    ON tt1.t1 = tt2.t2
) AS tt
WHERE tt.t1 <> tt.t2 COLLATE Cyrillic_General_CS_AS