Unerwartete implizite Konvertierung in einer Prozedur

7

Ich habe ein Verfahren wie dieses (vereinfacht):

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

In der Spalte Benutzername der Mitgliedstabelle befindet sich ein nicht gruppierter Index.

Der Plan-Cache zeigt eine implizite Konvertierung als solche:

Suchschlüssel [1]: Präfix: [MyDatabase]. [Dbo]. [Member] .Username = Skalaroperator (CONVERT_IMPLICIT (varchar (64), [@ Username], 0))

Ich habe mich nur gefragt, was diese implizite Konvertierung verursachen könnte, da sowohl der Parameter als auch der Felddatentyp "UserName" varchar (64) ist.

SP wird aus dem folgenden Framework aufgerufen:

EXEC test @Username=N'webSite.com'

Vielen Dank.

Stackoverflowuser
quelle
1
Verwenden Sie nicht nur konsistent N für Unicode und kein N für Varchar, sondern verwenden Sie immer das Schema-Präfix . Es orderist auch ein Schlüsselwort und somit eine schreckliche Wahl für einen Tabellennamen (und viele würden argumentieren, dass eine Tabelle mit Bestellungen oder Mitgliedern keine einzelnen Namen haben sollte - dies lässt den Eindruck entstehen, dass sie immer nur genau eine Zeile enthalten werden).
Aaron Bertrand
(Und FWIW Ich konnte die implizite Konvertierung einfach durch Hinzufügen von OPTION (RECOMPILE) zu der Anweisung innerhalb der Prozedur entfernen. Ich musste die Sortierung der Tabelle nicht ändern, den Plan-Cache löschen usw.)
Aaron Bertrand
1
@Stackoverflowuser Diese Antwort ist möglicherweise hilfreich, um zu verstehen, wie / warum die Sortierung sehr wichtig ist.
Kin Shah

Antworten:

6

Es war alles auf die Zusammenstellung der Säule zurückzuführen. Es unterschied sich von der Sortierung der Datenbank (und der Tabelle). Jetzt wurde die Sortierung der Spalte in die der Datenbank geändert, und es wird keine implizite Konvertierung mehr angezeigt. Habe keine Ahnung von den Interna und warum es das Problem verursacht hat.

Stackoverflowuser
quelle
5

CONVERT_IMPLICIT tritt auf, weil Sie eine Kollatierung in der Spalte haben, die nicht mit der Kollatierung des Parameters übereinstimmt. Der Parameter wird also in die Sortierung der Spalte konvertiert.

Zur weiteren Erläuterung: Es gibt Kollatierungszwangsregeln, die diese Konvertierung auslösen. Wenn Sie also eine implizite Sortierung für die Spalte und eine Zwangsvorgabe für den Parameter haben, wird der Parameter in die Sortierung der Spalte konvertiert. Wenn beide explizite, aber unterschiedliche Kollatierungen hätten, würde sich ein Kollatierungskonfliktfehler ergeben.

Ted
quelle
Wie unterscheidet sich das von der am höchsten bewerteten Antwort?
Colin 't Hart
Die Antwort war unvollständig und die Operation gab an, dass er nicht wusste, warum es passiert ist, was in meiner Antwort beschrieben ist. Das Problem war der Unterschied in der Sortierung zwischen Spalte und Parameter.
Ted