2

いくつかの用語を一致させる必要があるため、ユーザー定義関数で 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

しかし、CASE...WHEN THEN BLOCK を使用した元のスタイルでは、エラー メッセージが表示されます。

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 パーツで、Incorrect Syntax near case のエラーが発生し、when の近くで不正な構文が発生します。

最後の CREATE FUNCTION ブロックが GO で終わっているため、すべてを正しくバッチ処理しました。CASE のドキュメントによると、正しい構文があります。

他のスカラー関数を使用して、他のパラメーターに対応するシステム内のプロダクション コーディングを生成する、より大きなスカラー関数を構築しています。生産コーディングは製品と顧客に依存するため、CASE を使用できることが最善です。

また、Create Function 行の 2 番目の例では、「不正な構文: 'Create Function' はバッチ内の唯一のステートメントである必要があります」という追加のエラーが発生しますが、他のすべてが同一の場合、そのエラーは発生しません。 IF。

何が間違っていますか、または CASES はスカラー関数ではなく SQL クエリでのみ許可されていますか? エラー メッセージは、SQL Server Management Studio の波線エラー メッセージ システムからのものです。

4

2 に答える 2

4

ケースステートメントは次のようになります。

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
于 2008-11-19T18:15:08.940 に答える
3

あなたの問題は、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は単なる検索 (またはルックアップ) 式です。内部からはできません。VB やExcelRETURNのようなものです。以前の回答は基本的にそれを説明しました。IIF()IF()

  2. VARCHARを意味するVARCHAR(1)ため、切り捨てが発生します。つまり'BAD''B'. いくつかの に乗ったように発生したときに切り捨ての警告が表示されない理由はわかりませんが、そうですSQL INSERT

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

于 2008-11-19T18:41:17.717 に答える