Sql-Server

過程中的意外隱式轉換

  • April 7, 2015

我有這樣的程序(簡化):

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

成員表的使用者名列上有一個非聚集索引。

計劃記憶體顯示隱式轉換,如下所示:

尋找鑰匙

$$ 1 $$: 字首:$$ MyDatabase $$.$$ dbo $$.$$ Member $$.Username = 標量運算符(CONVERT_IMPLICIT(varchar(64),$$ @Username $$,0))

我只是想知道是什麼導致了這種隱式轉換,因為參數和欄位數據類型“使用者名”都是 varchar(64)?

SP 是從這樣的框架呼叫的:

EXEC test @Username=N'webSite.com'

謝謝你。

這一切都歸結為對列的整理。它與數據庫(和表)的排序規則不同。現在將列的排序規則更改為數據庫的排序規則,並且不再顯示隱式轉換。不知道內部結構以及導致問題的原因。

發生 CONVERT_IMPLICIT 是因為列上的排序規則與參數的排序規則不匹配。所以參數被轉換為列的排序規則。

進一步解釋 - 有觸發此轉換的排序規則強制規則。因此,如果您有列的隱式排序規則和參數的強制預設值,則參數將轉換為列的排序規則。如果兩者都有明確但不同的排序規則,則會導致排序規則衝突錯誤。

引用自:https://dba.stackexchange.com/questions/97171