2009-03-18 20 views
5

他のテーブル(Department)の主キーの既定の制約を持つテーブル(Employee)に列(MSSQL 2005)を追加しようとしています。それから私はこの列をそのテーブルにFKにするつもりです。基本的に、DepartmentIDが指定されていない場合、部門名に基づいて新しい従業員を基本部門に割り当てます。プログラムで決定された定数DEFAULT値を持つALTER TABLE

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 

生産、テスト、および開発データベースは同期の外に成長しているとDepartmentName =「RocketScience」ののDepartmentIDがまたはので、私はしたくないと同じであってもなくてもよい:
これは動作しません。 DEFAULT(somenumber)と言うだけです。どのような方法で問題を攻撃しても、「変数はALTER TABLE文で許可されていません。
これを行う正しい方法は何ですか?私はselect文をネストしようとしましたが、「サブクエリはこのコンテキストでは許されません。スカラ式だけが許可されています。」また

、私は1つのステートメントで列の値を移入代わりに



{更新値を} {ヌルをALTER}やってできた、本当に素晴らしいことだ何

を{nullではないALTER}ステップ。私はWITH VALUESコマンドについて何かを読んだが、動かすことができなかった。 ありがとうございます!

答えて

5

ストアドファンクションにあなたの部門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()) 

がその助けをしていますか?

マルク・

+0

私がしようとしますが、私はドキュメントが許される唯一のシステム機能を言ったと思った... –

+0

はそれを試してみてください - 私がやった - (SQL Server 2008で、つまり私のために働いた - しかし私は、これは2005年の間とを変更した疑い2008) –

+0

私はそれが素晴らしい仕事をあなたの答えを受け入れる! –

8

は受け入れ答えは偉大な(ありがとう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 
2

は、デフォルト値のための任意の値を使用することができます...運によって1つを見つけました。その後、変数の値でupdate文を実行することができます。

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; 
関連する問題