Sql-Server
過程中的意外隱式轉換
我有這樣的程序(簡化):
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 是因為列上的排序規則與參數的排序規則不匹配。所以參數被轉換為列的排序規則。
進一步解釋 - 有觸發此轉換的排序規則強制規則。因此,如果您有列的隱式排序規則和參數的強制預設值,則參數將轉換為列的排序規則。如果兩者都有明確但不同的排序規則,則會導致排序規則衝突錯誤。