sql >> データベース >  >> RDS >> Sqlserver

修正方法「プロシージャは、タイプ「ntext / nchar/nvarchar」のパラメータ「@statement」を予期しています。」 SQLServerのエラー

    sp_executesqlなどのストアドプロシージャを実行すると、エラーメッセージ214、レベル16が発生しやすくなります。 またはsp_describe_first_result_set

    幸い、修正も簡単です!

    このエラーが発生する最も一般的な理由は、文字列の前にNを付けるのを忘れたことです。 。

    したがって、この問題を修正するには、文字列の前にNを付けてみてください 。

    エラーの原因となるコードの例

    次のコードにより、このエラーが発生します。

    EXEC sp_executesql 'SELECT * FROM Cats'; 

    結果:

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

    このエラーの理由は、sp_executesqlの最初の引数が プロシージャは、Unicode定数またはUnicode変数のいずれかである必要があります。

    したがって、引数を文字列として指定する場合は、プレフィックスとしてNを付ける必要があります。 。

    ソリューション

    上記の問題の解決策は次のとおりです。

    EXEC sp_executesql N'SELECT * FROM Cats'; 

    結果:

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

    これは、テーブルの列とは関係がないことに注意してください。たとえば、私のCats テーブル、CatId 列はint およびCatsName 列はvarchar(60)

    変数

    文字列の代わりに変数を渡す場合は、変数の型を変更できます。これを行うと、引数の前にNを付ける必要がなくなります。 。

    エラーの原因となる変数の例を次に示します。

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

    結果:

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

    引数がUnicode定数でもUnicode変数でもないため、ここでも214エラーが発生します。

    これは、変数をUnicode変数として宣言することで修正できます。

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

    結果:

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

    もう1つの例

    上記の例では、sp_executesqlを使用しています プロシージャですが、プロシージャがUnicodeを予期しているが、取得しない場合はいつでもこのエラーが発生する可能性があります。

    Unicode引数を受け入れる別のシステムプロシージャは、sp_describe_first_result_setです。 。したがって、その手順を使用して同じエラーを強制することができます。

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

    結果:

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

    正確な表現は少し異なりますが、同じエラー(メッセージ214、レベル16)であり、同じ修正が加えられています。


    1. 動的SQL(パラメーターとしてテーブル名を渡す)

    2. パスワードプロンプトなしでUbuntuにMySQLをインストールする

    3. 私のお気に入りのPostgreSQLクエリとその重要性

    4. WHERE句は、INとJOINの前または後に実行する方が適切です