SQL ServerのCaseステートメントにより、ユーザー定義関数でエラーが発生します

StackOverflow https://stackoverflow.com/questions/302833

  •  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
  1. CASE は単なる検索(またはルックアップ)式です-内部から RETURN を実行することはできません- IIF()< VBの/ code>またはExcelの IF()。以前の答えは基本的にそれを説明しました。

  2. VARCHAR VARCHAR(1)を意味するため、切り捨てられます。つまり、 'BAD' が表示されることはありませんアウト、 'B' のみ。いくつかの SQL INSERT を取得した場合に切り捨て警告が表示されない理由はわかりませんが、そこに行きます。

  3. @ms は変数の名前です。その名前(テーブル?)で他のデータベースオブジェクトがない限り、msが受け入れられる理由はわかりません。 T-SQL のすべての変数とパラメーターには、次のように @ というプレフィックスが付きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top