【问题标题】:SQL Server error "Implicit conversion of because the collation of the value is unresolved due to a collation conflict."SQL Server 错误“隐式转换,因为值的排序规则由于排序规则冲突而未解决。”
【发布时间】:2010-10-05 07:53:24
【问题描述】:

我在开发存储过程时遇到这个错误

无法执行 varchar 值到 varchar 的隐式转换,因为值的排序规则由于排序规则冲突而未解决。

语句是这样的

Select City COLLATE DATABASE_DEFAULT AS Place, State, Country FROM DEPT1
UNION ALL
Select '' AS Place, 'Arizona' As State, Country FROM DEPT2

但是如果这样做也会报同样的错误

 Select City COLLATE DATABASE_DEFAULT AS Place, State, Country FROM DEPT1
 UNION ALL
 Select '' COLLATE DATABASE_DEFAULT AS Place, 'Arizona' As State, Country FROM DEPT2

实际上这段代码是别人写的,只是在编辑代码,不知道为什么他添加了 COLLATE DATABASE_DEFAULT 但如果我删除它也会给出同样的错误

无法执行 varchar 值到 varchar 的隐式转换,因为值的排序规则由于排序规则冲突而未解决。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您很可能在这两个地方都需要 COLLATE。

    Select City COLLATE DATABASE_DEFAULT AS Place, State, Country FROM DEPT1
    UNION ALL
    Select '' COLLATE DATABASE_DEFAULT AS Place, 'Arizona' As State, Country FROM DEPT2
    

    编辑:如果你在一个地方得到它,你可能在每个字符串上都需要它

    Select
        City COLLATE DATABASE_DEFAULT AS Place,
        State COLLATE DATABASE_DEFAULT AS State,
        Country COLLATE DATABASE_DEFAULT AS Country
    FROM DEPT1
    UNION ALL
    Select
        '' COLLATE DATABASE_DEFAULT,
        'Arizona' COLLATE DATABASE_DEFAULT ,
        Country COLLATE DATABASE_DEFAULT
    FROM DEPT2
    

    编辑2:

    发生这种情况是因为您的列排序规则可能与您的数据库排序规则不同。所以 "City" 有一个排序规则,但字符串常量有另一个排序规则。

    【讨论】:

    • 我怎样才能从我的语句中删除这个 COLLATE DATABASE_DEFAULT ......为什么要强制使用这个......实际上在一个语句中有 45 列,并且关于 union ALL of 6 statements 和更多然后一半是字符串...
    • 这对我来说是一个很好的提示,当我处理从几个 SYS 表(或视图)中进行选择以找出我的所有服务器登录名(主体)被授予的权限时。
    【解决方案2】:

    ALTER TABLE DEPT1 和 DEPT2 以便生成的表定义不包含任何 COLLATE

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2012-01-21
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2014-02-15
      相关资源
      最近更新 更多