Sql server 如何创建一个T-SQL函数来读取作为同一[update]事务一部分更新的值
我需要在几个记录的更新中使用一个函数 如何使T-SQL函数读取在更新期间更新的值 下面我创建了一个简单的示例,演示了我得到的结果 我的示例:表有Category列,我基于一个Category构建代码。函数查找类别为+1的最后一个。如果它是第一个记录的话,也可以是10000 如果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
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.在不依赖于阅读表格的情况下提前计算预期结果,谢谢你让我知道我的设计缺陷。。。