2

SQL我正在为应用程序实现按需缓存表,所以我有

CacheTable带柱子Type, Number, Value

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

所以我想要一个执行以下操作的函数

If ( CacheTablecontains Type, Number) 然后返回值 Else 调用GetValue( Type, Number)并将该值放入CacheTable并返回该值

有谁知道最优雅的方式来做到这一点?

我正在考虑使用SQL merge.

4

1 回答 1

0

不确定一个人能变得多么优雅,但我们可能会按照您描述的方式来做。查询数据库

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 之间插入了数字,则在插入时会出错。我只是抓住错误并跳过插入(因为我们可以假设值不会根据定义不同)。

于 2013-04-02T18:44:51.490 回答