我正在尝试向表(Employee)添加一列(MSSQL 2005),并使用另一个表(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(某个数字)。无论我以哪种方式解决问题,我都会不断收到“ALTER TABLE 语句中不允许使用变量”的信息。
这样做的正确方法是什么?我也尝试过嵌套 select 语句,该语句得到“在此上下文中不允许子查询。只允许使用标量表达式。”
另外,如果我可以在一个语句中填充列值而不是执行以下操作,那就太好了
{更改空}
{更新值}
{更改不为空}
脚步。我读过一些有关“WITH VALUES”命令的内容,但无法让它工作。
谢谢!!!
接受的答案效果很好(谢谢 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)