質問

別のテーブル(部門)の主キーの既定の制約を使用して、テーブル(従業員)に列(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のDepartmentID = <!>#8216; RocketScience <!>#8217;同じかもしれないし、そうでないかもしれないので、私は単にDEFAULT(somenumber)とは言いたくない。 <!>#8220; ALTER TABLEステートメントでは変数を使用できません<!>#8221;どの方法で問題を攻撃しても。
これを行う正しい方法は何ですか? <!>#8220;を取得するselectステートメントもネストしようとしました;このコンテキストではサブクエリは許可されません。スカラー式のみが許可されます。<!>#8221;

さらに、本当に素晴らしいことは、

{ALTER null}
{Update values}
{ALTER not null}

ステップ。 WITH VALUESコマンドについて何かを読みましたが、動作させることができませんでした。 ありがとう!!!

役に立ちましたか?

解決

コードをラップして、部門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())

それは役立ちますか?

マーク

他のヒント

受け入れられた答えは素晴らしく機能しました(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

列の追加後に外部キー制約を適用すると、テーブルを変更するときにデフォルト値に任意の値を使用できます。その後、変数値を使用して更新ステートメントを実行できます。

ALTER TABLE Employee 
ADD DepartmentID INT NOT NULL
Default -1;

UPDATE Employee
SET Employee.DepartmentID = @DepartmentID
WHERE DepartmentID = -1;

ALTER TABLE Employee 
ADD CONSTRAINT fk_employee_to_department FOREIGN KEY (DepartmentID) 
REFERENCES Department;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top