Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak naprawić „Procedura oczekuje parametru „@statement” typu „ntext/nchar/nvarchar”. Błąd w SQL Server

Dość łatwo napotkać błąd Msg 214, poziom 16 podczas wykonywania procedur składowanych, takich jak sp_executesql lub sp_describe_first_result_set .

Na szczęście jest to również łatwe do naprawienia!

Najczęstszym powodem pojawiania się tego błędu jest to, że zapomniałeś poprzedzić swój ciąg N .

Dlatego, aby rozwiązać ten problem, spróbuj poprzedzić swój ciąg przedrostkiem N .

Przykład kodu, który powoduje błąd

Poniższy kod powoduje ten błąd.

EXEC sp_executesql 'SELECT * FROM Cats'; 

Wynik:

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

Powodem tego błędu jest to, że pierwszy argument sp_executesql procedura musi być albo stałą Unicode, albo zmienną Unicode.

Dlatego, gdy podajesz argument jako ciąg, musisz poprzedzić go N .

Rozwiązanie

Oto rozwiązanie powyższego problemu.

EXEC sp_executesql N'SELECT * FROM Cats'; 

Wynik:

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

Zauważ, że nie ma to nic wspólnego z kolumnami w tabeli. Na przykład w moim Cats tabeli, CatId kolumna to int i CatsName kolumna to varchar(60) .

Zmienne

Jeśli przekazujesz zmienną zamiast ciągu, możesz zmienić typ zmiennej. Dzięki temu nie będziesz musiał poprzedzić argumentu N .

Oto przykład zmiennej, która powoduje błąd.

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

Wynik:

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

Po raz kolejny otrzymujemy błąd 214, ponieważ argument nie jest stałą Unicode ani zmienną Unicode.

Możemy to naprawić, deklarując zmienną jako zmienną Unicode.

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

Wynik:

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

Jeszcze jeden przykład

Powyższe przykłady używają sp_executesql procedury, ale możesz otrzymać ten błąd za każdym razem, gdy procedura oczekuje Unicode, ale go nie otrzymuje.

Inną procedurą systemową, która akceptuje argument Unicode jest sp_describe_first_result_set . Dlatego możemy wymusić ten sam błąd za pomocą tej procedury.

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

Wynik:

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

Chociaż dokładne sformułowanie jest nieco inne, jest to ten sam błąd (komunikat 214, poziom 16) i ma tę samą poprawkę.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UNION wyniki wielu procedur składowanych

  2. Błąd serwera SQL 110:W instrukcji INSERT jest mniej kolumn niż wartości określone w klauzuli VALUES.

  3. SQL Server sprawdza rozróżnianie wielkości liter?

  4. Poziomy izolacji programu SQL Server:seria A

  5. Jak określić nazwę klucza podstawowego w EF-Code-First?