ALTER TABLE具有以编程方式确定的常量DEFAULT值

时间:2009-03-18 19:05:20

标签: sql-server tsql default alter-table

我正在尝试将一个列(MSSQL 2005)添加到一个表(Employee),其默认约束为另一个表(Department)的主键。然后我将把这个列作为该表的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(somenumber)。无论我采用哪种方法来解决问题,我都会在“ALTER TABLE语句中不允许使用变量”。
这样做的正确方法是什么?我已经尝试嵌套select语句,它获得“在此上下文中不允许子查询。只允许标量表达。“

另外,我可以在一个语句中填充列值,而不是执行
{ALTER null}
{更新值} < br /> {ALTER not null}

步骤。我读了一些有关WITH VALUES命令的内容,但无法使其工作。 感谢!!!

3 个答案:

答案 0 :(得分:8)

接受的答案效果很好(谢谢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

答案 1 :(得分:7)

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

这有帮助吗?

马克

答案 2 :(得分:3)

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

#define _CRT_SECURE_NO_WARNINGS
#include `<stdio.h>`

void main()
{
    int row, col, num;          // Initialization of 10 x 10 array.
    int arr[10][10];

    printf("Enter a number: "); // User input of integer.
    scanf("%d", &num);

    for (row = num; row < num + 10; row++)         /* Nested for loop. Loop starts at determined
                                                   number and stops ten steps further.*/
    {
        for (col = num; col < num + 10; col++)
        {
            arr[col][row] = row * col;            
            printf("%d\t", arr[col][row]);
        }
        printf("\n");
    }
}