过程中意外的隐式转换

Sta*_*ser 7 performance sql-server stored-procedures execution-plan sql-server-2008-r2 query-performance

我有一个这样的程序(简化):

CREATE PROCEDURE test @userName VARCHAR(64)
SELECT * 
FROM member M
INNER JOIN order O  
ON M.MemberId=O.MemberId
WHERE M.Username = @userName
Run Code Online (Sandbox Code Playgroud)

Member 表的 Username 列上有一个非聚集索引。

计划缓存显示隐式转换如下:

查找键[1]:前缀:[MyDatabase].[dbo].[Member].Username = Scalar Operator(CONVERT_IMPLICIT(varchar(64),[@Username],0))

我只是想知道是什么导致了这种隐式转换,因为参数和字段数据类型“UserName”都是 varchar(64)?

像这样从框架调用 SP:

EXEC test @Username=N'webSite.com'
Run Code Online (Sandbox Code Playgroud)

谢谢你。

Sta*_*ser 6

这完全取决于列的整理。它不同于数据库(和表)的排序规则。现在将列的排序规则更改为数据库的排序规则,并且不再显示隐式转换。不知道内部结构以及它导致问题的原因。


Ted*_*Ted 5

发生 CONVERT_IMPLICIT 是因为列上的排序规则与参数的排序规则不匹配。所以参数被转换为列的排序规则。

进一步解释 - 有触发此转换的排序规则强制规则。因此,如果您对该列有一个隐式排序规则,并且该参数有一个 coercible-default,则该参数将转换为该列的排序规则。如果两者都有明确但不同的排序规则,则会导致排序规则冲突错误。