SQLServerエラーメッセージ8116が表示され、引数データ型の日付が部分文字列関数の引数1に対して無効であるというテキストが表示された場合 、これは、関数に間違ったデータ型を渡しているためです。この場合は、SUBSTRING()
機能。
他の多くのコンテキストでも同じエラー(メッセージ8116)が発生する可能性があります。これは、SUBSTRING()
に限定されません。 機能。
エラーの例
エラーを生成するコードの例を次に示します。
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
結果:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
ここで、date
を渡しました SUBSTRING()
の最初の引数として入力します 、ただしこれは許可されていません。
SUBSTRING()
関数は、最初の引数として文字、バイナリ、テキスト、ntext、または画像式を受け入れます。これらの受け入れられたタイプの1つではない引数を渡すと、上記のエラーが発生します。
前述のように、他の関数でも発生する可能性があります。いずれにせよ、それは間違ったデータ型を関数に渡していることを意味します。
ソリューション1
まず、列を渡す場合は、正しい列があることを確認します。解決策は、間違った列名を正しい列名に置き換えるという単純な問題である可能性があります。
変数を渡す場合も同じです–それが正しい変数であることを確認してください。間違った変数を正しい変数に置き換えることで、この問題を解決できる可能性があります。
ソリューション2
正しい列名/変数があることが確実な場合、このエラーを修正する1つの方法は、引数を適切なデータ型に変換することです。
たとえば、上記の例を次のように調整できます。
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
結果:
2020
ソリューション3
しかし、何かを変換する前に、一歩下がって、望ましい結果を生み出すためのより簡単な方法があるかどうかを考えることが有益な場合があります。
たとえば、上記の例では、日付から年を抽出するだけです。この場合、SUBSTRING()
を廃止したほうがよい場合があります。 YEAR()
を優先して、完全に機能します 機能:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
結果:
2020
これを行う別の方法は、FORMAT()
を使用することです。 機能:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
結果:
2020