2016-04-23 75 views
2

SQL表具有类型为NVARCHAR(MAX)的列,其中包含客户状态的历史记录。在StatusHistory列的值SQL Server:高级计算列公式

例子:

20120401P,20140715A,20160118T 

含义:

  • 2012年4月1,客户被待定
  • 2015年7月15日的客户开始活跃
  • 1月18日,2016客户被终止

状态将始终按照时间顺序升序排列!

在该表中,我有一个名为CustStatus中,我想通过上述基于GETDATE()阅读StatusHistory列来存储当前客户状态列。

目前我正在使用用户定义函数的CustStatus中的公式执行此操作。

我可能是错的,但我认为如果我可以做到这一点而不使用用户定义的函数,我可以提高查询的性能,包括这些信息。

那么,会不会有一个公式让我可以根据GETDATE()StatusHistory填充CustStatus

+5

这是一个**糟糕的设计!**不要浪费你的时间来处理这个问题 - 你需要**修复你的设计!**。您应该有一个具有当前状态的“客户”表格和一个引用“客户”表格的单独的“CustomerHistory”表格,并包含日期和状态的列。有了这样一个**正确的关系**设置,查询将是一件轻而易举的事! –

+0

**为什么我不断得到答案,如果我的问题是“设计是否好?”**。这不是我问的!所以我想没有人知道如何去做。 –

+1

@FrankM。,因为回答你的实际问题将鼓励你继续使用它:) –

回答

1

设计很糟糕。但是,根据您的要求假设你有没有前途的状态,你可以得到最近的状态非常简单:

select right(StatusHistory, 1) as CurrentStatus 

我强烈,你应该修复设计,并有一个CustomerStatusHistory表marc_s同意妥善保管。但是,如果您无法修复数据结构,至少可以帮助您获取所需的信息。

注意:使用right()通常比用户定义的函数快得多。

+0

感谢您的回复至今。首先,字符串可能会收到未来的状态。此外,我确实有一个单独的状态表,并且我试图找到一种替代方法,以避免每次需要检索给定日期的状态时读取该表。如果我打印带有通过日期的报告,我希望报告能够反映当天的状态,如果我打印的是同一份报告,请在今天或发布日期。 –

+0

当然,必须有更好的方法来做到这一点,同时提高查询的性能。打开任何建议。 –