代码之家  ›  专栏  ›  技术社区  ›  DiningPhilanderer

使用编程确定的常量默认值更改表

  •  6
  • DiningPhilanderer  · 技术社区  · 17 年前

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

    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可能相同,也可能不同,因此我不想只说默认值(somenumber)。我一直在获取ALTERTABLE语句中不允许的变量,无论我以何种方式处理该问题。
    正确的方法是什么?我还尝试嵌套select语句,该语句获取在此上下文中不允许的子查询。只允许使用标量表达式。

    此外,如果我可以在一条语句中填充列值,而不是执行


    {更新值}


    步骤。我读了一些关于WITHVALUES命令的内容,但无法使其工作。

    3 回复  |  直到 17 年前
        1
  •  11
  •   DiningPhilanderer    17 年前

    这个被接受的答案非常有效(谢谢marc_),但在我考虑了一段时间后,我决定走另一条路。

    如果后来有人搞乱了功能,那么就没有人可以输入员工,原因也不明显。 (即使不是这样,服务器上仍有不需要的额外功能)

    不仅如此,因为我使用了带有NOTNULL的默认关键字,所以表被重新填充,并且我不必运行多个命令来完成它。我很幸运地找到了那个。。。

    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
  •  8
  •   marc_s MisterSmith    17 年前

    您可以将查找部门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())
    

    这有用吗?

        3
  •  3
  •   Rich Hildebrand    9 年前

    如果在添加列后应用外键约束,则可以在更改表时使用任何值作为默认值。然后可以使用变量值运行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;