当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ALTERTABLE具有以编程方式确定的常量DEFAULT值》经验,为你挑选了2个好方法。

我试图添加一个列(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}
{Update values}
{ALTER not null}

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



1> DiningPhilan..:

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



2> marc_s..:

您可以包装代码以将您的部门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())

这有帮助吗?

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有