Ich habe eine gespeicherte Prozedur, die einen Parameter akzeptiert.
CREATE PROCEDURE [dbo].[Stored_Proc_Name] (@ParamID NVARCHAR(255) = NULL)
Ich rufe diese gespeicherte Prozedur auf und übergebe eine eindeutige Kennung, so etwas;
EXEC [Stored_Proc_Name] 'a6ed99c1-29c8-43f4-9e3a-0065e6dc7fc1'
Die gespeicherte Prozedur führt ein wenig XML-Verarbeitung durch und gibt eine Ergebnismenge zurück. Dies ist ziemlich einfach.
Für einige Parameter, die übergeben werden, wird ein Typkonvertierungsfehler angezeigt.
Msg 8114, Level 16, State 5, Procedure Stored_Proc_Name, Line 0
Error converting data type nvarchar to int.
Ich dachte anfangs, dass dies ein Problem mit den Daten ist, aber das Problem löst sich von selbst, wenn ich eine lokale Variable innerhalb der gespeicherten Prozedur wie folgt deklariere und dann diese lokale Variable anstelle des Parameters verwende. Die einzigen Stellen, an denen dieser Parameter verwendet wird, sind WHERE
Klauseln in meinem gespeicherten Prozess.
CREATE PROCEDURE [dbo].[Stored_Proc_Name] (@ParamID NVARCHAR(255) = NULL)
AS
DECLARE @localID nvarchar(255)
SET @localID = @ParamID
Das Problem ist behoben und der Vorgang läuft einwandfrei.
Irgendwelche Ideen zum nächsten Schritt der Untersuchung oder etwas Offensichtliches, das ich verpasst habe?
Aktualisieren:
Bei weiteren Untersuchungen war dies ein Problem mit einem XML-Attribut, bei dem [1] fehlte. Es scheint also versucht zu haben, mehrere Attribute zu konvertieren, was den Fehler verursacht hat. Ich untersuche derzeit, wie es mit der Variablen behoben wurde, und werde es aktualisieren, sobald ich eine vernünftige Antwort habe. Ich werde die Antwort als akzeptiert markieren, damit jemand das Kopfgeld bekommt.
quelle
Antworten:
Ich frage mich, ob die Parameter- / Variablensituation wirklich nur eine nicht verwandte implizite Konvertierung in Ihrer Abfrage maskiert. Dies ist eine Strecke, und jemand, der mit den Interna von SQL Server besser umgehen kann, kann möglicherweise klären, ob ich hier völlig falsch liege, aber ich vermute, dass Sie beim Umschalten zwischen dem Parameter- und dem Variablenansatz unterschiedliche Ausführungspläne erhalten. Die Unterschiede in den Plänen können drastisch genug sein, wenn ein impliziter
varchar
→int
Konvertierungsfehler nur bei dem parametrisierten Ansatz auftritt, der auf der Verknüpfungsreihenfolge basiert, im Gegensatz zum variablen Ansatz, da die Variable nicht richtig abgehört wird und eine völlig andere Verknüpfungsreihenfolge verwendet wird als Ergebnis.Um meine Theorie zu testen, werfen Sie
OPTION (RECOMPILE)
am Ende Ihrer Abfrage eine Anweisung, wenn Sie Ihre gespeicherte Prozedur in eine Variable konvertieren und sehen, was passiert. Wenn der Fehler erneut auftritt, wird in Ihrer Abfrage wahrscheinlich eine andere implizite Konvertierung ausgeführt, die nur bei einem bestimmten Ausführungsplan auftritt. Dies bedeutet, dass der angezeigte Fehler nicht mit der Eingabe zusammenhängt, sondern mit Daten, die sich bereits im System und befinden wie Sie Tabellen innerhalb Ihrer Anweisung verbinden.quelle