プログラムで決定された定数DEFAULT値を持つALTER TABLE
-
20-08-2019 - |
質問
別のテーブル(部門)の主キーの既定の制約を使用して、テーブル(従業員)に列(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;