프로그래밍 방식으로 결정된 상수 기본값이있는 변경 테이블
-
20-08-2019 - |
문제
다른 테이블 (부서)의 기본 키의 기본 제약 조건이있는 열 (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;