从函数计算列值

时间:2014-07-03 15:41:03

标签: sql sql-server-2008 sql-server-2012

我有一个旧程序正在使用的表格,号角。在添加表时,它会产生某种映射表的字典。要创建此映射,列必须按顺序排列。 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'因为它在受影响的列之后。

请注意:列的值是从包含该列的表之外的其他表计算的。

有没有办法让我可以改变这个列来包含我的函数计算的值?

1 个答案:

答案 0 :(得分:0)

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