我有一个旧程序clarion正在使用的表。在添加表格的时候,它使得某种字典能够映射表格。要创建此映射,列必须按顺序排列。 Clarion不会按名称读取它,但它会按顺序和大小读取它。我不得不'改变'表中的一列。然而,该列需要通过函数计算:从函数计算列值
ALTER FUNCTION uf_gifValue (@aID int)
RETURNS varchar(8)
WITH SCHEMABINDING
BEGIN
DECLARE @returnValue varchar(8)
SELECT @returnValue = ISNULL(C.columnName, '')
FROM
dbo.TableA AS A (this is old table)
LEFT JOIN dbo.TableB AS B
ON A.BId= B.BId
LEFT JOIN dbo.TableC AS C
ON B.CId= C.CId
WHERE
A.AId= @aID
RETURN ISNULL(@returnValue , '')
END
GO
受影响具有架构类似的表:
Table
{
column1
.
.
.
.
AffectedColumn
.
.
.
.
AId int identity(1,1) PRIMARY KEY}
首先,我试图让功能,使临时表,降旧表上的约束条件并使用计算字段创建临时表。然后,我提出了对临时表的约束,并将其从旧表插入到临时表中。最后,我放弃了旧表并将临时表重命名为旧表名。此方法不起作用,因为旧表被函数引用并且不能被删除。
接下来,我试图做一个什么都不做并返回''的函数。我用计算的字段创建了临时表并删除了旧表的约束。然后,我提出了对临时表的约束,并将旧表从表中插入到临时表中,删除旧表并将临时表重命名为旧表名。然后,我修改了函数,使其返回适当的值。 我对这个方法有这个问题,我不能在被引用时改变计算列或函数。
我试过的最后一件事是放弃旧表上的约束,制作函数,添加计算列,并添加受影响的列之后的列以保留列顺序。然后,我删除了位于受影响列和新列之间的列,包括旧列。但是,这不起作用,因为我不能删除'AID',因为它位于受影响的列之后。
请注意:该列的值是从包含该列的表以外的其他表中计算出来的。
有没有一种方法可以改变此列以包含我的函数计算的值?
正在考虑这一点,但由于我有一些数以百万计的数据 –