SQL ServerのCaseステートメントにより、ユーザー定義関数でエラーが発生します
-
08-07-2019 - |
質問
多くの用語で一致する必要があるため、ユーザー定義関数でcaseステートメントを使用します。一致にテーブルを使用できますが、計算列の定義内にそれを配置することはできません。
これはIFステートメントで機能します:
CREATE FUNCTION MaraSizeNumber
(
@ms varchar
)
RETURNS varchar
AS
BEGIN
IF ms = '16-18' RETURN '1'
ELSE IF ms = '18-20' RETURN '2'
ELSE IF ms = '20-22' RETURN '3'
ELSE IF ms = '22+' RETURN '4'
ELSE IF ms = '24+' RETURN '5'
ELSE IF ms = '14-16' RETURN '7'
ELSE RETURN 'BAD'
END
しかし、ケースを使用して元のスタイルで...その後、ブロックするとエラーメッセージが表示されます。
CREATE FUNCTION MaraSizeCaseExample
(
@ms varchar
)
RETURNS varchar
AS
BEGIN
CASE ms
WHEN '16-18' THEN RETURN '1'
WHEN '18-20' THEN RETURN '2'
WHEN '20-22' THEN RETURN '3'
WHEN '22+' THEN RETURN '4'
WHEN '24+' THEN RETURN '5'
WHEN '14-16' THEN RETURN '7'
ELSE RETURN 'BAD'
END
END
私はwhenパーツの場合に近い場合の不正な構文と誤った構文のエラーを受け取ります。
最後のCREATE FUNCTIONブロックがGOで終わるため、すべてを正しくバッチ処理しました。CASEのドキュメントによると、正しい構文があります。
私は、他のスカラー関数を使用して、他のパラメーターに対応するシステムのプロダクションコーディングを生成する、より大きなスカラー関数を作成しています。本番コーディングは製品と顧客に依存するため、CASEを使用できることが最善です。
「関数の作成」行の2番目の例では、「不正な構文:「関数の作成」のみがバッチ内の唯一のステートメントでなければなりません」という追加のエラーが発生しますが、他のすべての場合は同じではありませんIFのエラー。
私は何を間違えていますか、またはCASESはスカラー関数ではなくSQLクエリでのみ許可されますか?エラーメッセージは、SQL Server Management Studioの波線のエラーメッセージシステムから発生しています。
解決
caseステートメントは次のようになります。
RETURN CASE @ms
WHEN '16-18' THEN '1'
WHEN '18-20' THEN '2'
WHEN '20-22' THEN '3'
WHEN '22+' THEN '4'
WHEN '24+' THEN '5'
WHEN '14-16' THEN '7'
ELSE 'BAD'
END
他のヒント
あなたの問題は、varcharのサイズを指定していないためだと思います(デフォルトは1です)。これにより、入力と出力が1文字に切り捨てられます。 (関数内の変数に @
もありませんでした。)
したがって、 PRINT dbo.SizeExample('16 -18 ')
は' B '
を印刷します(これは切り捨てられるだけでなく、おそらく必要な答えではありませんが、 '1'
)
代わりに試してください:
CREATE FUNCTION MaraSizeExample
(
@ms varchar(5)
)
RETURNS varchar(3)
AS
BEGIN
RETURN CASE @ms
WHEN '16-18' THEN '1'
WHEN '18-20' THEN '2'
WHEN '20-22' THEN '3'
WHEN '22+' THEN '4'
WHEN '24+' THEN '5'
WHEN '14-16' THEN '7'
ELSE 'BAD'
END
END
-
CASE
は単なる検索(またはルックアップ)式です-内部からRETURN
を実行することはできません-IIF()< VBの/ code>またはExcelの
IF()
。以前の答えは基本的にそれを説明しました。 -
VARCHAR
はVARCHAR(1)
を意味するため、切り捨てられます。つまり、'BAD'
が表示されることはありませんアウト、'B'
のみ。いくつかのSQL
INSERT
を取得した場合に切り捨て警告が表示されない理由はわかりませんが、そこに行きます。 -
@ms
は変数の名前です。その名前(テーブル?)で他のデータベースオブジェクトがない限り、msが受け入れられる理由はわかりません。T-SQL
のすべての変数とパラメーターには、次のように@
というプレフィックスが付きます。