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)であり、同じ修正が加えられています。