8

我正在尝试将列(MSSQL 2005)添加到具有另一个表(部门)的主键的默认约束的表(员工)中。然后我将把这个列作为那个表的 FK。本质上,如果没有提供 DepartmentID,这将根据部门名称将新员工分配到基础部门。
这不起作用:

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

生产、测试​​和开发数据库已经不同步,DepartmentName = 'RocketScience' 的 DepartmentID 可能相同也可能不同,所以我不想只说 DEFAULT(某个数字)。无论我以哪种方式解决问题,我都会不断收到“ALTER TABLE 语句中不允许使用变量”。
这样做的正确方法是什么?我也尝试过嵌套 select 语句,它得到“在这种情况下不允许子查询。只允许标量表达式。”

此外,真正棒的是我可以在一个语句中填充列值,而不是执行

{ALTER null}
{Update values}
{ALTER not null}

步骤。我读了一些关于 WITH VALUES 命令的内容,但无法让它工作。谢谢!!!

4

3 回答 3

11

接受的答案效果很好(谢谢marc_s),但在我考虑了一段时间后,我决定走另一条路。
主要是因为服务器上必须有一个函数,我认为每次添加员工时都会调用该函数。
如果后来有人弄乱了该功能,那么没有人可以进入员工,原因也不会很明显。(即使这不是真的,那么服务器上仍然有不需要存在的额外功能)

我所做的是将命令动态地组装在一个变量中,然后使用 EXECUTE 命令调用它。

不仅如此,由于我使用了带 NOT NULL 的 DEFAULT 关键字,表被重新填充,我不必运行多个命令来完成它。我碰巧找到了那个...

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
于 2009-03-18T21:39:30.347 回答
8

您可以将代码包装到一个存储函数中以查找您的部门 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())

这有帮助吗?

马克

于 2009-03-18T19:14:20.400 回答
3

如果在添加列后应用外键约束,则可以在更改表时使用任何值作为默认值。然后,您可以使用变量值运行更新语句。

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;
于 2016-10-20T13:40:28.747 回答