2009-03-18 14 views
5

Estoy tratando de agregar una columna (MSSQL 2005) a una tabla (Empleado) con una restricción predeterminada de una clave principal de otra tabla (Departamento). Luego voy a hacer que esta columna sea FK en esa mesa. Esencialmente, esto asignará nuevos empleados a un departamento base basado en el nombre del departamento si no se proporciona DepartmentID.
Esto no funciona:ALTER TABLE con el valor DEFAULT constante por definición determinado mediante programación

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 

La producción, pruebas, y las bases de datos de desarrollo han crecido fuera de sincronía y la DepartmentID para la DepartmentName = 'RocketScience' puede o no ser el mismo, así que no quiero solo decir DEFAULT (somenumber). Sigo recibiendo "Las variables no están permitidas en la instrucción ALTER TABLE" sin importar en qué dirección ataque el problema.
¿Cuál es la forma correcta de hacer esto? He intentado anidar también la declaración de selección, que dice "Las subconsultas no están permitidas en este contexto. Sólo se permiten expresiones escalares.”

Además, lo que sería realmente grande que podía rellenar los valores de columna en una declaración en lugar de hacer la

{ALTER null}
{valores Actualizar}
{alterar no nulo}

pasos. Leí algo sobre el comando WITH VALUES pero no pude hacerlo funcionar. ¡Gracias!

Respuesta

5

Se puede ajustar el código para encontrar su ID de departamento en una función almacenada y el uso que en su estado de restricción DEFAULT:

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

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

    RETURN @DepartmentID 
END 

Y luego:

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

ayuda eso?

Marc

+0

Voy a tratar pero pensé que la documentación de dichas funciones único sistema permite ... –

+0

Inténtelo - lo hice - trabajó para mí (en SQL Server 2008, que es - pero dudo que esto ha cambiado entre 2005 y 2008) –

+0

¡Acepto su respuesta, funcionó muy bien! –

8

La respuesta aceptada trabajó grandes (gracias marc_s) pero después pensé en ello durante un tiempo me decidí a ir otra ruta.
Principalmente porque tiene que haber una función en el servidor que creo que termina llamándose cada vez que se agrega un empleado.
Si alguien se equivocó con la función más tarde, entonces nadie podría ingresar a un empleado y la razón no sería obvia. (Incluso si eso no es cierto, entonces todavía hay funciones adicionales en el servidor que no necesitan estar allí)

Lo que hice fue ensamblar el comando dinámicamente en una variable y luego llamarlo usando el comando EXECUTE.

No solo eso, sino que utilicé la palabra clave DEFAULT con NOT NULL, la tabla se volvió a llenar y no tuve que ejecutar varios comandos para hacerlo. He encontrado que uno por suerte ...

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

Si aplica su restricción de clave externa después de añadir la columna, se puede utilizar cualquier valor para el valor por defecto cuando se altera la tabla. Luego puede ejecutar una declaración de actualización con su valor de variable.

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; 
Cuestiones relacionadas