Konvertierungsfehler am Parameter, aber nicht variabel


7

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 WHEREKlauseln 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.


Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Paul White 9

Antworten:


5

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 varcharintKonvertierungsfehler 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.