从商店或商店获取价值,如果不存在则获取

时间:2018-04-16 20:04:10

标签: sql-server tsql

我希望实现的方法是以某种方式以前生成或生成,存储和返回数据,这可以用作函数 - 在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?

0 个答案:

没有答案