Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beheben Sie „Prozedur erwartet Parameter ‚@statement‘ vom Typ ‚ntext/nchar/nvarchar‘.“ Fehler im SQL-Server

Beim Ausführen gespeicherter Prozeduren wie sp_executesql ist es recht einfach, auf Fehler Msg 214, Level 16 zu stoßen oder sp_describe_first_result_set .

Glücklicherweise ist es auch einfach zu beheben!

Der häufigste Grund für diesen Fehler ist, dass Sie vergessen haben, Ihrer Zeichenfolge N voranzustellen .

Um dieses Problem zu beheben, versuchen Sie daher, Ihrer Zeichenfolge N voranzustellen .

Beispiel für Code, der den Fehler verursacht

Der folgende Code verursacht diesen Fehler.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Ergebnis:

Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

Der Grund für diesen Fehler ist, dass das erste Argument der sp_executesql Prozedur muss entweder eine Unicode-Konstante oder eine Unicode-Variable sein.

Wenn Sie das Argument als Zeichenfolge bereitstellen, müssen Sie ihm daher N voranstellen .

Die Lösung

Hier ist die Lösung für das obige Problem.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Ergebnis:

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Beachten Sie, dass dies nichts mit den Spalten in der Tabelle zu tun hat. Zum Beispiel in meinen Cats Tabelle, die CatId Spalte ist int und der CatsName Spalte ist varchar(60) .

Variablen

Wenn Sie statt einer Zeichenfolge eine Variable übergeben, können Sie den Variablentyp ändern. Dadurch ersparen Sie sich, dem Argument N voranzustellen .

Hier ist ein Beispiel für eine Variable, die den Fehler verursacht.

DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;

Ergebnis:

Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

Wieder erhalten wir den Fehler 214, weil das Argument keine Unicode-Konstante oder Unicode-Variable ist.

Wir können dies beheben, indem wir die Variable als Unicode-Variable deklarieren.

DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;

Ergebnis:

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Noch ein Beispiel

Die obigen Beispiele verwenden sp_executesql Prozedur, aber Sie können diesen Fehler immer dann erhalten, wenn eine Prozedur Unicode erwartet, es aber nicht bekommt.

Eine andere Systemprozedur, die ein Unicode-Argument akzeptiert, ist sp_describe_first_result_set . Daher können wir denselben Fehler mit dieser Prozedur erzwingen.

EXEC sp_describe_first_result_set 
    @tsql = 'SELECT * FROM Cats', 
    @params = null, 
    @browse_information_mode = 1;

Ergebnis:

Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1
Procedure expects parameter '@tsql' of type 'nvarchar(max)'.

Obwohl der genaue Wortlaut etwas anders ist, ist es derselbe Fehler (Msg 214, Level 16) und hat dieselbe Lösung.