Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 不自动更新的计算列_Sql Server_Function_Tsql_Stored Procedures - Fatal编程技术网

Sql server 不自动更新的计算列

Sql server 不自动更新的计算列,sql-server,function,tsql,stored-procedures,Sql Server,Function,Tsql,Stored Procedures,我有一个计算列,它通过将当前的max 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 Id

我有一个计算列,它通过将当前的max 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
如果我在函数中的select中添加WHERE IdNum=@IdNum,这会产生工作的假象,但实际上它是从IdNum=@IdNum的一行中拾取最大IdNum,而不是从所有IdNum中实际拾取当前的最大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)

有没有办法做到这一点?如果没有,是否有其他解决方案?

如果我的理解是正确的,您是否尝试获取某个表的最大id,以在更新时显示在每条记录旁边? 现在,所有记录旁边都有相同的max id

这是因为max id是唯一的一个。您没有提供上下文

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


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

我认为您需要使用group by为每个组指定maxidnum。显示一些示例数据以及您希望计算列的外观?您的回答方法并没有真正的帮助。它更像是在对我尖叫,问我为什么要这样那样做,而不是建议一个解决方案或详细的替代方案。然而,它确实以一种迂回的方式引导我找到了我需要的解决方案,因此我将您的答案标记为答案。我完全放弃了函数和计算字段,创建了一个更新存储过程。我没有恶意,所以如果结果是这样,请原谅。我的目标是指出,你的方法无法实现你设定的目标。我只是给了你一个提示,而不是一个详细的例子,因为最终的决定取决于你的应用程序的其余部分,而我对此几乎一无所知。我很高兴你终于明白了。