Sql server 如何创建一个T-SQL函数来读取作为同一[update]事务一部分更新的值

Sql server 如何创建一个T-SQL函数来读取作为同一[update]事务一部分更新的值,sql-server,Sql Server,我需要在几个记录的更新中使用一个函数 如何使T-SQL函数读取在更新期间更新的值 下面我创建了一个简单的示例,演示了我得到的结果 我的示例:表有Category列,我基于一个Category构建代码。函数查找类别为+1的最后一个。如果它是第一个记录的话,也可以是10000 如果update是一条记录,它就可以正常工作,但如果不是这样,它会用相同的值更新所有记录 以下是工作代码: CREATE TABLE Tbl ( Id INT NOT NULL PRIMARY KEY, Cat

我需要在几个记录的更新中使用一个函数

如何使T-SQL函数读取在更新期间更新的值

下面我创建了一个简单的示例,演示了我得到的结果

我的示例:表有Category列,我基于一个Category构建代码。函数查找类别为+1的最后一个。如果它是第一个记录的话,也可以是10000

如果update是一条记录,它就可以正常工作,但如果不是这样,它会用相同的值更新所有记录

以下是工作代码:

CREATE TABLE Tbl
(
    Id INT NOT NULL PRIMARY KEY,
    Category CHAR(1) NOT NULL,
    Code INT NULL
)

CREATE FUNCTION dbo.GetNextAvailableCode
     (@Category CHAR(1))
RETURNS INT
AS
BEGIN
    DECLARE @MaxCode INT

    SELECT @MaxCode = MAX(Code) 
    FROM dbo.Tbl
    WHERE Category = @Category

    SET @MaxCode = ISNULL(@MaxCode + 1, 10000);

    RETURN @MaxCode
END;
GO

INSERT INTO Tbl (Id, Category)
VALUES (1, 'A'), (2, 'A'), (3, 'A'),
       (4, 'B'), (5, 'B'),
       (6, 'C'), (7, 'C'), (8, 'C'), (9, 'C')

SELECT * FROM Tbl

UPDATE dbo.Tbl
SET Code = dbo.GetNextAvailableCode(Category)
WHERE Code IS NULL

SELECT * FROM Tbl
GO 

DROP TABLE Tbl;
DROP FUNCTION dbo.GetNextAvailableCode;
以下是我得到的结果:

我想得到的是:

但只有在下一次函数调用可以看到已更改的值时才有可能


你知道如何实现这样的东西吗?

因为不可能使用函数来达到预期的效果,我重新编写了更新,在没有函数的情况下使用,它工作了

以下是生成我需要的结果的更新:

;WITH data AS (
    SELECT Id, Category, Code, ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Id) AS RowNo 
        FROM dbo.Tbl
        WHERE Code IS NULL
)
, maxData AS (
    SELECT Category, MAX(Code) AS MaxCode 
        FROM dbo.Tbl
        GROUP BY Category

)
UPDATE S
    SET Code = ISNULL(T.MaxCode, 10000) + S.RowNo
    FROM data S JOIN maxData T ON T.Category = S.Category
    WHERE S.Code IS NULL

结果:

根据设计,函数可以看到值的预先更改。一个线轴是专门为万圣节的保护,以防止你想要的效果。你需要改变你的方法,在没有功能的情况下进行。e、 g.在不依赖于阅读表格的情况下提前计算预期结果,谢谢你让我知道我的设计缺陷。。。