Pergunta

Eu estou tentando adicionar uma coluna (MSSQL 2005) para uma mesa (Employee) com uma restrição padrão de uma chave primária de outra tabela (Departamento). Então eu vou fazer esta coluna uma FK a essa tabela. Essencialmente, este irá atribuir novos funcionários para um departamento de base baseado fora o nome do departamento, se nenhum DepartmentID é fornecido.
Isso não funciona:

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

A produção, bases de dados de teste e de desenvolvimento têm crescido fora de sincronia eo DepartmentID para o DepartmentName = ‘Rocketscience’ pode ou não ser o mesmo que eu não quero apenas dizer PADRÃO (someNumber). Eu continuo recebendo “As variáveis ??não são permitidos na instrução ALTER TABLE” não importa o caminho que atacar o problema.
Qual é a maneira correta de fazer isso? Eu tentei nidificação a instrução SELECT assim que recebe “Subqueries não são permitidos neste contexto. Somente expressões escalares são permitidas.”
Além disso, o que seria realmente grande que eu poderia preencher os valores da coluna em uma instrução em vez de fazer o
{ALTER null}
{atualizar valores}
{ALTER não null}
etapas. Eu li algo sobre o COM comando valores, mas não poderia fazê-lo funcionar. Thanks !!!

Foi útil?

Solução

Você poderia envolver o código para encontrar o seu ID departamento em uma função armazenada e usar isso em sua declaração PADRÃO restrição:

CREATE FUNCTION dbo.GetDepartment()
RETURNS INT
AS
BEGIN
  DECLARE         @DepartmentID           INT

  SELECT          @DepartmentID = DepartmentID
  FROM            Department
  WHERE           RealName = 'RocketScience'

  RETURN @DepartmentID
END

E, em seguida:

ALTER TABLE     [Employee]
ADD                     [DepartmentID] INT NULL
CONSTRAINT      [DepartmentIDOfAssociate] DEFAULT (dbo.GetDepartment())

Isso ajuda?

Marc

Outras dicas

A resposta aceita trabalhou grandes (marc_s Graças), mas depois eu pensei sobre isso por um tempo eu decidi ir outra rota.
principalmente porque não tem que ser uma função deixada no servidor que eu acho que acaba sendo chamado cada vez que um empregado é adicionado.
Se alguém mexeu com a função mais tarde, em seguida, ninguém podia entrar um empregado ea razão não seria óbvia. (Mesmo que isso não é verdade, então ainda há funções extras no servidor que não precisam de estar lá)

O que fiz foi montar o comando de forma dinâmica em uma variável e, em seguida, chamar isso usando o comando EXECUTAR.

Não só isso, mas desde que eu usei a palavra-chave DEFAULT com NOT NULL a mesa estava de volta povoada e eu não tenho que executar vários comandos para fazê-lo. Descobri que um fora de sorte ...

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

Se você aplicar a sua restrição de chave estrangeira após a adição da coluna, você pode usar qualquer valor para o valor padrão ao alterar a tabela. Em seguida, você pode executar uma instrução de atualização com o seu valor variável.

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top