SQL按需缓存表(可能使用SQL MERGE)



我正在为应用程序实现一个按需SQL缓存表,这样我就有了

带列Type, Number, ValueCacheTable

然后我有一个叫做GetValue( Type, Number ) 的函数

所以我想有一个函数来完成以下

如果(CacheTable包含Type,Number),则返回值否则调用GetValue( Type, Number)并将该值放入CacheTable并返回值

有人知道最优雅的方法吗?

我正在考虑使用SQL merge.

不确定一个人能有多优雅,但我们可以按照你描述的方式来做。查询数据库

select Value from Tab1 where Type=@type and Number=@num

如果没有返回任何行,则计算该值,然后将其存储在数据库中以备下次使用。然而,如果"计算值"需要数据库本身,并且我们可以在数据库中计算它,那么我们可以用一次数据库往返来完成整个周期——也许更"优雅",但至少比3次往返(查找、计算、存储)更快。

declare @val int
select @val=Value from Tab1 where Type=@type and Number=@num
if @@ROWCOUNT=0 BEGIN
  exec compute_val @type,@num,@val OUTPUT
  insert into Tab1 values (@type,@num,@val)
END
SELECT @val[Value]--return

SQL Merge的唯一用途是,如果您认为可能有并发用户,并且在上面的select和insert之间插入了数字,则在插入时会出现错误。我只会捕捉到错误并跳过插入(因为我们可以假设值在定义上不会有什么不同)。

最新更新