Wie behebe ich die Fehlerprozedur? Erwartet den Parameter '@parameters' vom Typ 'ntext / nchar / nvarchar'?

8

Ich versuche, eine gespeicherte Prozedur zu verwenden, um die Ergebnisse einer Tabelle und eine zugeordnete Tabelle oder letzte Änderungen an der Datenbank anzuzeigen. Die gespeicherte Prozedur ist:

%Vor%

Es soll zusätzlich zu den Ergebnissen der select-Anweisung zu den Elementen zurückkehren. Es gibt keine Eingaben für die gespeicherte Prozedur. Die gespeicherte Prozedur wird in SQL Management Studio (2008) ordnungsgemäß kompiliert, die Seite gibt jedoch einen Fehler zurück: Microsoft OLE DB-Provider für SQL Server-Fehler '80040e14'

Prozedur erwartet den Parameter '@parameters' vom Typ 'ntext / nchar / nvarchar'. index.asp, Zeile 61

Zeile 61 der Seite ist fett gedruckt:

%Vor%

Ich habe den Eindruck, dass dies durch einen SQL-Code-Fehler verursacht wird, aber ich sehe es nicht. Eine schnelle Überprüfung des Objrs.state gibt eine 0 zurück, was bedeutet, dass das Problem definitiv im SQL-Code liegt. Für das Leben von mir kann ich nicht identifizieren, warum dieser Fehler erzeugt wird.

    
Techmaniac 01.08.2011, 21:04
quelle

2 Antworten

15

In dieser Antwort werde ich versuchen, das Problem, das Sie in der Frage erwähnt haben, neu zu erstellen und erklären, wie ich das gelöst habe.

Zuerst erstellen wir zwei Tabellen mit den Namen dbo.MKTG_Recent und dbo.Table_1 unter Verwendung der Skripte im Abschnitt Tabellen-Skript erstellen . Ich habe diese Tabellen basierend auf einigen Annahmen erstellt, die ich unter Verwendung der Daten in der Frage gemacht habe. Mit dem Skript wird die Tabelle dbo.MKTG_Recent mit 1 Datensatz gefüllt.

Erstellen Sie als Nächstes die gespeicherte Prozedur dbo.MKTG_Current mithilfe des Skripts, das im Abschnitt Stored Procedure-Skript erstellen bereitgestellt wird.

Wenn wir versuchen, die gespeicherte Prozedur mit dem Befehl EXEC als EXEC MKTG_Current null, null auszuführen, wird die Fehlermeldung Msg 214, Level 16, State 3, Procedure sp_executesql, Line 1 Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'. ausgegeben. Siehe Screenshot # 1

Nach dem Lesen von MSDN über die Verwendung des Verfahren sp_executesql , ich habe festgestellt, dass der zweite Parameter der gespeicherten procedure definiert die Typen der Ausgabeparameter und muss eine Unicode-Zeichenkette sein. Also habe ich die gespeicherte Prozedur geändert, indem ich den zweiten Parameter als Unicode-String angegeben habe, indem ich N vorangestellt habe. Siehe Screenshot # 2 für die Änderung der gespeicherten Prozedur.

Screenshot # 3 zeigt die Ausgabe der gespeicherten Prozedur dbo.MKTG_Current nach den Änderungen an. Die gespeicherte Prozedur erzeugt zwei Ausgaben. Eine für die Abfrageanweisung in der Variablen @Bork, die an sp_executesql übergeben wird, und die andere Ausgabe entspricht der SELECT-Anweisung, die die OUTPUT-Variablen anzeigt.

Aufgrund der Anforderung bin ich nicht sicher, ob Sie sogar sp_executesql aufrufen müssen. Sie können die gespeicherte Prozedur wie im Abschnitt Vereinfachte gespeicherte Prozedur gezeigt schreiben. Ich könnte falsch liegen, weil ich die Anforderung nicht vollständig verstehe. Screenshot # 4 zeigt die Ausgabe der vereinfachten gespeicherten Prozedur. Die Anweisung SELECT ist nicht erforderlich, da die Werte über die Parameter OUTPUT übergeben werden. Ich habe die Anweisung SELECT nur eingefügt, um die Abfrageausgabe anzuzeigen.

Hoffe, das zeigt Ihnen in die richtige Richtung.

Tabellen erstellen Skript:

%Vor%

Skript für gespeicherte Prozeduren erstellen:

%Vor%

Vereinfachte gespeicherte Prozedur:

%Vor%

Screenshots:

# 1: Ausführung der Fehlermeldung

# 2: Änderung an der gespeicherten Prozedur

# 3: Ausgabe der gespeicherten Prozedur nach den Änderungen

# 4: Vereinfachte Ausgabe gespeicherter Prozeduren

    
user756519 02.08.2011, 02:09
quelle
4

Sie haben @Bork als NVARCHAR deklariert. Also warum sagst du:

%Vor%

? Sollte sein:

%Vor%

So definieren wir NVARCHAR (Unicode) Strings. Das N steht für national. Wenn Sie das Präfix N weglassen, geht sp_executesql davon aus, dass es VARCHAR ist, und das führt zu dem Fehler.

BEARBEITEN für Kieren

Während Sie technisch NVARCHAR Literale ohne das N-Präfix deklarieren, gibt es mehrere Gründe, warum Sie das nie tun sollten. Eine ist, den Fehler zu vermeiden, den user873479 empfängt. Andere sorgen für korrekte Ergebnisse. Einige Beispiele:

(A) Versuchen wir sp_executesql mit dem Präfix N und ohne. Obwohl es in der Zeichenfolge keine tatsächlichen Unicode-Zeichen gibt, führt das Vergessen des N-Präfixes beim Aufruf von sp_executesql zum genau gleichen Fehler, um den es bei dieser Frage geht:

%Vor%

Ergebnisse

%Vor%

(B) Nun versuchen wir eine sehr einfache Zuordnung eines Unicode-Zeichens zu einer NVARCHAR -Variable. Beachten Sie, wie ohne den N-Präfix der tatsächliche Wert verloren geht?

%Vor%

Ergebnisse

%Vor%

(C) Gehen wir nun einen Schritt weiter. Lassen Sie uns einige Unicode-Daten in eine Tabelle einfügen:

%Vor%

Ergebnisse

%Vor%

Und ich könnte weitere Beispiele finden, bei denen implizit zwischen CHAR / VARCHAR und NCHAR / NVARCHAR Suchvorgänge in Scans umgewandelt werden können, aber ich denke, dass Fehlermeldungen und falsche Ergebnisse für jetzt ausreichen sollten.

Sie können sichergehen, dass NVARCHAR Literale deklariert werden, ohne das Präfix N zu verwenden, aber nur, wenn Sie Prozeduren nicht aufrufen, die NVARCHAR erwarten, und nur dann, wenn Ihre Daten keine Unicode-Zeichen enthalten (In diesem Fall würde ich mich fragen müssen, warum Sie überhaupt NVARCHAR verwendet haben).

    
Aaron Bertrand 01.08.2011 21:11
quelle