我希望实现的方法是以某种方式以前生成或生成,存储和返回数据,这可以用作函数 - 在UPDATE脚本中加入或APPLY所需。
所以,让数据生成函数:
ALTER FUNCTION generateData()
RETURNS NVARCHAR(20)
AS
BEGIN
RETURN 'asdyukyuk' --some rng related algorithm
END
"获取或生成,保存并获得"过程:
ALTER PROCEDURE getOrGenerateAndGet (@orig NVARCHAR(20), @result NVARCHAR(20) OUTPUT)
AS
BEGIN
IF @orig IS NULL
BEGIN
SET @result = NULL
END
ELSE
BEGIN
DECLARE @hash VARBINARY(64) = dbo.getHash(@orig)
SELECT @result = GENERATED_DATA FROM STORED_DATA WHERE HASH = @hash
IF @result IS NULL
BEGIN
SET @result = dbo.generateData()
INSERT INTO STORED_DATA (HASH, GENERATED_DATA) VALUES (@hash, @result)
END
END
RETURN 1
END;
GO
UPDATE脚本:
UPDATE FRAGILE_DATA SET FRAGILE_COLUMN = getOrGenerateAndGet(FRAGILE_COLUMN)
它显然无法正常工作,因为getOrGenerateAndGet不起作用。
然而,用功能方式:
CREATE FUNCTION getOrGenerateAndGet (@orig NVARCHAR(20))
RETURNS NVARCHAR(20)
AS
BEGIN
DECLARE @result NVARCHAR(20)
IF @orig IS NULL
BEGIN
SET @result = NULL
END
ELSE
BEGIN
DECLARE @hash VARBINARY(64) = dbo.getHash(@orig)
SELECT @result = GENERATED_DATA FROM STORED_DATA WHERE HASH = @hash
IF @result IS NULL
BEGIN
SELECT @result = dbo.generateData()
EXEC sp_executesql N'INSERT INTO STORED_DATA (HASH, GENERATED_DATA) VALUES (@hash, @result)'
END
END
RETURN @result
END;
GO
它仍然不起作用,因为"只能在函数内执行函数和一些扩展存储过程。"
有没有办法实现这一点,而不启用sql命令shell?