没有自动更新的计算列

时间:2014-06-13 21:04:54

标签: sql-server function tsql stored-procedures

我有一个计算列,它通过将当前最大ID添加到某个前缀来自动创建确认号。它有效,但不完全是我需要它的工作方式。

这是功能

ALTER FUNCTION [dbo].[SetEPNum](@IdNum INT)
RETURNS VARCHAR(255)
AS
BEGIN
return (select 'SomePrefix' + RIGHT('00000' + CAST(MAX(IdNum) AS VARCHAR(255)), 5)
FROM dbo.someTable
/*WHERE IdNum = @IdNum*/)

END

如果我将WHERE IdNum = @IdNum添加到函数中的select中,这会产生工作的错觉,但实际上它从IDNum = @IdNum的一行中选择最大IdNUM而不是实际选择当前最大值来自所有IDNums的IDNUM。如果我删除where语句,则计算函数只需在每次更改时将每个字段设置为max Id。

这是表格

CREATE TABLE [dbo].[someTable](
[IdNum] [int] IDENTITY(1,1) NOT NULL,
[First_Name] [varchar](50) NOT NULL,
[Last_Name] [varchar](50) NOT NULL,
[EPNum]  AS ([dbo].[SetEPNum]([IdNum]))
) ON [PRIMARY]

 GO

 SET ANSI_PADDING OFF
 GO

这是计算列

ALTER TABLE dbo.someTable
ADD EPNum AS dbo.SetEPnum(IdNum)

有没有办法实现这个目标?如果没有,是否有替代解决方案?

1 个答案:

答案 0 :(得分:2)

如果我的理解是正确的,那么您尝试在更新时将每个记录旁边的某个表的最大ID显示出来? 现在,您可以在所有记录旁边获得相同的最大ID。

这是因为最大id是1而且只有1。你没有提供任何背景信息。

在我看来,这是触发器甚至更新声明的工作。为什么要使用计算列?每次显示数据时都会重新计算计算列。

如果您绝对需要这样做,则应该使用其他字段(例如修改日期),并从当前更新的记录中获取最大ID。这完全取决于应用程序的业务逻辑以及您尝试实现的目标。