2014-07-03 79 views
1

我有一个旧程序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',因为它位于受影响的列之后。

请注意:该列的值是从包含该列的表以外的其他表中计算出来的。

有没有一种方法可以改变此列以包含我的函数计算的值?

回答

0

为什么不重命名表并添加一个由旧表命名的视图,该视图返回所有内容,甚至可能实时评估函数的结果。这种简单的视图是可编辑的。

+0

正在考虑这一点,但由于我有一些数以百万计的数据 –