8

別のテーブル (部門) の主キーの既定の制約を使用して、列 (MSSQL 2005) をテーブル (従業員) に追加しようとしています。次に、この列をそのテーブルの FK にします。基本的に、DepartmentID が指定されていない場合、これにより、部門名に基づいて新しい従業員が基本部門に割り当てられます。
これは動作しません:

DECLARE     @ErrorVar       INT
DECLARE     @DepartmentID       INT

SELECT      @DepartmentID = DepartmentID
FROM        Department
WHERE       RealName = 'RocketScience'

ALTER TABLE     [Employee]
ADD             [DepartmentID] INT NULL
CONSTRAINT      [DepartmentIDOfAssociate] DEFAULT (@DepartmentIDAssociate)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
    GOTO FATAL_EXIT
END

Production、Test、Development データベースは同期が取れなくなり、DepartmentName = 'RocketScience' の DepartmentID は同じである場合とそうでない場合があるため、単に DEFAULT (somenumber) とは言いたくありません。どの方法で問題に取り組んでも、「変数は ALTER TABLE ステートメントでは許可されていません」というメッセージが表示され続けます。
これを行う正しい方法は何ですか?selectステートメントもネストしてみましたが、「このコンテキストではサブクエリは許可されていません。スカラー式のみが許可されています。」 さらに、 {ALTER null} {Update values} {ALTER not null}の手順を実行

する代わりに、1 つのステートメントで列の値を入力できるのは本当に素晴らしいことです。WITH VALUES コマンドについて何か読んだことがありますが、それを機能させることができませんでした。ありがとう!!!





4

3 に答える 3

11

受け入れられた答えはうまくいきました(ありがとうmarc_s)が、しばらく考えた後、別のルートに行くことにしました。
主な理由は、従業員が追加されるたびに呼び出されると思われる関数がサーバーに残っている必要があるためです。
後で誰かが機能をいじった場合、誰も従業員に入ることができず、その理由は明らかではありません。(そうでなくても、サーバーには必要のない余分な機能がまだあります)

私がしたことは、コマンドを変数に動的にアセンブルし、EXECUTE コマンドを使用して呼び出すことでした。

それだけでなく、NOT NULL で DEFAULT キーワードを使用したため、テーブルが元に戻され、それを完了するために複数のコマンドを実行する必要がありませんでした。たまたまそれを見つけた...

DECLARE     @ErrorVar                   INT
DECLARE     @DepartmentIDRocketScience          INT
DECLARE     @ExecuteString                  NVARCHAR(MAX)

SELECT          @DepartmentIDRocketScience = DepartmentID
FROM            Department
WHERE           RealName = 'RocketScience'

SET @ExecuteString = ''
SET @ExecuteString = @ExecuteString + 'ALTER TABLE      [Employee] '
SET @ExecuteString = @ExecuteString + 'ADD              [DepartmentID] INT NOT NULL '
SET @ExecuteString = @ExecuteString + 'CONSTRAINT       [DF_DepartmentID_RocketScienceDepartmentID] DEFAULT ' +CAST(@DepartmentIDAssociate AS NVARCHAR(MAX))
EXECUTE (@ExecuteString)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
    GOTO FATAL_EXIT
END
于 2009-03-18T21:39:30.347 に答える
8

部門 ID を検索するコードをストアド関数にラップし、それを DEFAULT 制約ステートメントで使用できます。

CREATE FUNCTION dbo.GetDepartment()
RETURNS INT
AS
BEGIN
  DECLARE         @DepartmentID           INT

  SELECT          @DepartmentID = DepartmentID
  FROM            Department
  WHERE           RealName = 'RocketScience'

  RETURN @DepartmentID
END

その後:

ALTER TABLE     [Employee]
ADD                     [DepartmentID] INT NULL
CONSTRAINT      [DepartmentIDOfAssociate] DEFAULT (dbo.GetDepartment())

それは役に立ちますか?

マルク

于 2009-03-18T19:14:20.400 に答える