将函数结果保持为常数的方法

时间:2015-09-15 05:51:04

标签: sql-server tsql

我今天需要创建一个函数,它总是在它执行的特定数据库上返回完全相同的值。它可能/可能不是相同的数据库,这就是为什么它必须能够在第一次需要时从表中加载它。

CREATE FUNCTION [dbo].[PAGECODEGET] ()
RETURNS nvarchar(6)
AS
BEGIN
    DECLARE @PageCode nvarchar(6) = ( SELECT PCO_IDENTITY FROM PAGECODES WHERE PCO_PAGE = 'SWTE' AND PCO_TAB = 'RECORD' )

    RETURN @PageCode
END

PCO_IDENTITY字段是一个sql标识字段,因此一旦第一次插入记录,它总是会返回相同的结果。

我的问题是,有没有办法将这个值保持为等同于C#只读变量的东西?

从性能的角度来看,我知道sql会优化计划等,但从最佳实践的角度来看,我认为可能有更好的方法。

我们使用混合的SQL Server,但最低的是2008 R2,以防有特定版本的解决方案。

1 个答案:

答案 0 :(得分:1)

我担心在SQL Server中没有像你建议的全局变量这样的东西。

正如您所指出的,该函数可能会在另一个数据库上返回不同的结果,具体取决于各种因素,例如插入行时,表中已存在的其他值等等 - 基本上,不能依赖此行的PCO_IDENTITY值保持一致。

一些观察结果:

  • 我不知道如何偶尔获得这个价值确实会成为性能瓶颈。我不认为最佳做法会涵盖这一点,因为从表格中选择一个值是最基本的。
  • 如果这是另一个更大的查询的一部分,通过直接使用PAGECODES表的连接可能会获得更好的性能,而不是可能为每一行运行此函数

但是,如果你真的很担心:

  • 数据库中有些对象是持久的 - 表。当您第一次插入此值时,检索PCO_IDENTITY值,并创建一个新表,其中包含您可以加入查询的新表。对于一个值来说似乎有点浪费,不是吗? (请注意,您也可以查看视图,但是如何比您开始使用的功能表现更好?)

  • 您可以使用PCO_IDENTITY将这些值强制为具有特定IDENTITY_INSERT值的行。这样的价值是一致的,你知道它是什么 - 你可以在你的查询中硬编码。 (注意:之后再次关闭IDENTITY_INSERT,插入此表的其他行将继续自动重新生成)

TL; DR:你是怎么做的可能很好。我怀疑你正在努力优化一些不是问题的东西。一如既往 - 如果有疑问,请尝试一些方法并进行衡量。

相关问题