2

SQL Server 初心者の質問:

SQL Server (2008) に計算列を導入しようとしています。SQL Server Management Studio のテーブル デザイナーでこれを行うことができますが、デザイナーは、この列の式を定義するために 1 つの編集セルしか提供しません。私の計算列はかなり複雑になるため (いくつかのデータベース フィールドといくつかのケースの違いに応じて)、列定義を入力するためのより快適で保守しやすい方法が必要です (書式設定のための改行などを含む)。

SQL Server で関数 (スカラー値関数またはテーブル値関数) を定義するオプションがあることを確認しました。そのような関数を定義し、この関数を列指定として使用する方がよいでしょうか? また、どのような関数 (スカラー値、テーブル値) ですか?

簡単な例を作成するには:

2 つのデータベース列があります。

DateTime1 (smalldatetime, NULL)
DateTime2 (smalldatetime, NULL)

ここで、4 つの可能な値を持つことができる計算列 "Status" を定義したいと考えています。ダミー言語:

if (DateTime1 IS NULL and DateTime2 IS NULL)
    set Status = 0
else if (DateTime1 IS NULL and DateTime2 IS NOT NULL)
    set Status = 1
else if (DateTime1 IS NOT NULL and DateTime2 IS NULL)
    set Status = 2
else
    set Status = 3

理想的にはGetStatus()、「ステータス」の値を計算したいテーブル行のさまざまな列値にアクセスできる関数が必要であり、計算された列の仕様GetStatus()をパラメーターなしで定義するだけです。

それはまったく可能ですか?または、「複雑な」計算列定義を操作する最良の方法は何ですか?

事前にヒントをありがとう!

4

3 に答える 3

10

これには常にユーザー定義関数を使用することもできます。「複雑な」コードを UDF にラップし、それを使用して計算列を定義します。

CREATE FUNCTION dbo.GetStatus(@DateTime1 DATETIME, @DateTime2 DATETIME)
RETURNS INT
AS BEGIN
    DECLARE @Result INT

    IF (@DateTime1 IS NULL AND @DateTime2 IS NULL)
       SET @Result = 0
    ELSE IF (@DateTime1 IS NULL AND @DateTime2 IS NOT NULL)
       SET @Result = 1
    ELSE IF (@DateTime1 IS NOT NULL AND @DateTime2 IS NULL)
       SET @Result = 2
    ELSE
       SET @Result = 3

    RETURN @Result
END

次に、計算列を次のように定義します。

ALTER TABLE dbo.YourTable
    ADD Status AS dbo.GetStatus(DateTime1, DateTime2)
于 2010-04-08T07:12:53.750 に答える
8

これは、alter table ステートメントで行うことができます。

alter table my_table_name
  add Status as 
    case 
      when (DateTime1 IS NULL and DateTime2 IS NULL) then 0
      when (DateTime1 IS NULL and DateTime2 IS NOT NULL) then 1
      when (DateTime1 IS NOT NULL and DateTime2 IS NULL) then 2
      else 3
    end

ばかげたコピー アンド ペースト構文エラーを修正するために編集

于 2010-04-07T21:38:03.860 に答える
0

トリガーを使用して、挿入または更新時に列の値を確保できます。

于 2010-04-07T21:28:59.533 に答える