我有一个计算列,它通过将当前最大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)
有没有办法实现这个目标?如果没有,是否有替代解决方案?
答案 0 :(得分:2)
如果我的理解是正确的,那么您尝试在更新时将每个记录旁边的某个表的最大ID显示出来? 现在,您可以在所有记录旁边获得相同的最大ID。
这是因为最大id是1而且只有1。你没有提供任何背景信息。
在我看来,这是触发器甚至更新声明的工作。为什么要使用计算列?每次显示数据时都会重新计算计算列。
如果您绝对需要这样做,则应该使用其他字段(例如修改日期),并从当前更新的记录中获取最大ID。这完全取决于应用程序的业务逻辑以及您尝试实现的目标。