我今天需要创建一个函数,它总是在它执行的特定数据库上返回完全相同的值。它可能/可能不是相同的数据库,这就是为什么它必须能够在第一次需要时从表中加载它。
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,以防有特定版本的解决方案。
答案 0 :(得分:1)
我担心在SQL Server中没有像你建议的全局变量这样的东西。
正如您所指出的,该函数可能会在另一个数据库上返回不同的结果,具体取决于各种因素,例如插入行时,表中已存在的其他值等等 - 基本上,不能依赖此行的PCO_IDENTITY
值保持一致。
一些观察结果:
PAGECODES
表的连接可能会获得更好的性能,而不是可能为每一行运行此函数但是,如果你真的很担心:
数据库中有些对象是持久的 - 表。当您第一次插入此值时,检索PCO_IDENTITY
值,并创建一个新表,其中包含您可以加入查询的新表。对于一个值来说似乎有点浪费,不是吗? (请注意,您也可以查看视图,但是如何比您开始使用的功能表现更好?)
您可以使用PCO_IDENTITY
将这些值强制为具有特定IDENTITY_INSERT
值的行。这样的价值是一致的,你知道它是什么 - 你可以在你的查询中硬编码。 (注意:之后再次关闭IDENTITY_INSERT
,插入此表的其他行将继续自动重新生成)
TL; DR:你是怎么做的可能很好。我怀疑你正在努力优化一些不是问题的东西。一如既往 - 如果有疑问,请尝试一些方法并进行衡量。