Sql 为什么我在将所有值显式转换为varchar后仍会收到隐式转换警告?

Sql 为什么我在将所有值显式转换为varchar后仍会收到隐式转换警告?,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我从下面得到一个隐式转换警告,但我不知道为什么。所有内容都被显式转换为VARCHAR 警告说: 表达式中的类型转换(CONVERT(varchar(30),datepart(year,CONVERT_IMPLICIT(datetime,[GrantDate],0)),0))可能会影响查询计划选择中的“CardinalityEstimate” 我想我可能需要在YEAR函数中显式地将GrantDate从SMALLDATETIME转换为DATETIME,但这并没有删除警告。我愿意让这个问题溜走,因为我

我从下面得到一个隐式转换警告,但我不知道为什么。所有内容都被显式转换为
VARCHAR

警告说:

表达式中的类型转换(CONVERT(varchar(30),datepart(year,CONVERT_IMPLICIT(datetime,[GrantDate],0)),0))可能会影响查询计划选择中的“CardinalityEstimate”

我想我可能需要在
YEAR
函数中显式地将GrantDate从
SMALLDATETIME
转换为
DATETIME
,但这并没有删除警告。我愿意让这个问题溜走,因为我不认为它对性能有任何影响,但是客户端扫描我们的所有查询,如果它们包含隐式转换,就会拒绝它们

SELECT CONVERT(VARCHAR, FORMAT(DAY(GrantDate), 'D2')) + '-' + CONVERT(VARCHAR, FORMAT(GrantDate, 'MMM')) + '-' + CONVERT(VARCHAR, YEAR(CONVERT(DATETIME, GrantDate))) AS MyDateKey
FROM dbo.MyTable

你到底想在这里实现什么?上面的内容肯定过于复杂了。为什么所有的format()函数都是。。。如果您必须尝试选择格式(getdate(),'dd-MMM-yyyy'),那么对于
CONVERT(varchar(11),GrantDate,106)
可能也会更好,@johncapelletti,因为
格式
往往速度非常慢function@DaleK警告中的所有大写字母
CONVERT\u IMPLICIT
部分。@Larnu format()是一把双刃剑。一些以性能为代价的强大功能。如果少用。。。我看没什么害处。此外,OP似乎在寻找一种特定的格式,而convert(…,106)已经关闭,这将需要一个replace()