문제

다른 테이블 (부서)의 기본 키의 기본 제약 조건이있는 열 (MSSQL 2005)을 테이블 (직원)에 추가하려고합니다. 그런 다음이 열을 그 테이블에 FK로 만들 것입니다. 본질적으로 이것은 부서의 제공이없는 경우 부서 이름을 기준으로 신입 사원을 기본 부서에 할당합니다.
이것은 작동하지 않습니다.

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

생산, 테스트 및 개발 데이터베이스는 Synch에서 성장하여 DepartmentName = 'RocketScience'에 대한 DepartmentId가 동일하거나 동일하지 않을 수도 있으므로 기본값을 말하고 싶지 않을 수도 있습니다. 나는 어떤 방식으로 문제를 공격하든“Alter Table 문서에서 변수가 허용되지 않습니다”를 계속 얻습니다.
이것을하는 올바른 방법은 무엇입니까? 나는이 맥락에서“하위 쿼리가 허용되지 않는다. 스칼라 표현 만 허용됩니다.”

또한, 정말 좋은 점은 무엇을하는지 대신 한 명령문으로 열 값을 채울 수 있습니다.

{alter null}
{업데이트 값}
{unull 님이 아님}

단계. 나는 value 명령에 대해 무언가를 읽었지만 그것을 작동시킬 수 없었습니다. 감사!!!

도움이 되었습니까?

해결책

부서 ID를 저장된 함수로 찾아서 코드를 랩핑하고 기본 제약 조건 문서에서 사용할 수 있습니다.

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 명령을 사용하여 호출하는 것입니다.

그뿐만 아니라 NULL이없는 기본 키워드를 사용한 이후 테이블이 채워졌고 완료하기 위해 여러 명령을 실행할 필요가 없었습니다. 나는 운이 좋았다 ...

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