【问题标题】:(Select FirstName + ' ' + LastName from Members gives error Implicit conversion of varchar value to varchar cannot be performed(Select FirstName + ' ' + LastName from Members 给出错误 varchar 值到 varchar 的隐式转换无法执行
【发布时间】:2015-01-21 06:56:12
【问题描述】:
Select FirstName + ' ' + LastName from Members 

给出错误:

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

但是当我将FirstNameLastName 放在单独的列中时效果很好,比如

Select FirstName, LastName From Members

我想在一列中选择名字和姓氏

【问题讨论】:

标签: sql sql-server sql-server-2008 correlated-subquery


【解决方案1】:

似乎您在同一个表中有不同的排序规则 - 非常不寻常

试试这个:

SELECT 
  FirstName COLLATE DATABASE_DEFAULT + ' ' 
    + LastName COLLATE DATABASE_DEFAULT AS FullName
FROM Members 

如果可行,我建议您将排序规则更改为 FirstName 和 LastName 的相同,而不是更正您的查询。

这是如何更改排序规则的示例:

ALTER TABLE Members 
  ALTER COLUMN LastName 
    varchar(20) COLLATE DATABASE_DEFAULT NOT NULL

【讨论】:

  • 是的,这行得通……但是 collat​​e 是什么?为什么会出现在这张桌子上?
  • @mike 这里是link 描述排序规则
【解决方案2】:

试试这个

select CAST(FirstName AS VARCHAR) + ' ' + CAST(LastName AS VARCHAR)from Members 
or
select CONVERT(VARCHAR(100),FirstName) + ' ' + CONVERT(VARCHAR(100),LastName )from Members 

【讨论】:

  • 表中firstname和lastname列的数据类型是什么??
  • varchar(20) 两个字段且不为空都有字符
  • 在列后添加 COLLATE DATABASE_DEFAULT 尝试使用
【解决方案3】:

查看您的 tempdb 上的排序规则。您可以在属性中看到它。

您必须将此排序规则添加到 Statements 以临时更改字段的排序规则。

示例:

您的数据库有一个排序规则“Latin1_General_CS_AS”,tempdb 的排序规则是“Latin1_General_CI_AS”,您的语句必须如下所示,因为动态 SQL 将在 tempdb 中处理

【讨论】:

    【解决方案4】:

    试试这个

    Select concat(concat(FirstName , ' '), LastName) as final from Members 
    

    【讨论】:

    • 'concat' 不是可识别的内置函数名。
    • 我使用 SQL Server 2008
    • concat 是 sqlserver 2012
    • 然后我们就可以在sql中使用COLLATE函数了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2012-08-16
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多