2009-03-18 5 views
5

Я пытаюсь добавить столбец (MSSQL 2005) в таблицу (Employee) с ограничением по умолчанию первичного ключа другой таблицы (отдела). Тогда я собираюсь сделать этот столбец FK для этой таблицы. По сути, это назначит новых сотрудников базовому отделу, основанному на имени отдела, если не будет предоставлен отдел.
Это не работает:ALTER TABLE с программно определяемым постоянным значением DEFAULT

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 

Производство, испытание и базы развития выросли из синхронизации и DepartmentID для DepartmentName = «RocketScience» может или не может быть таким же, так что я не хочу просто сказать DEFAULT (somenumber). Я продолжаю получать «Переменные не допускаются в инструкции ALTER TABLE» независимо от того, каким образом я атакую ​​проблему.
Каков правильный способ сделать это? Я также попытался вставить инструкцию select, которая получает «Подзапросы в этом контексте не разрешены. Только скалярные выражения допускаются.»

Кроме того, что было бы очень здорово, я мог бы заполнить значение столбца в одном операторе вместо того, чтобы делать то

{ALTER нуля}
{значения Update}
{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.

Не только это, но так как я использовал ключевое слово DEFAULT с NOT 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 
2

Если применить ограничение внешнего ключа после добавления столбца, вы можете использовать любое значение для значения по умолчанию при изменении таблицы. Затем вы можете запустить инструкцию 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^