2012-10-22 31 views
4

请假设你有一个名为BEER_HERE表,有两列:功能基于指数2005

BEER_CODE VARCHAR(50) 
BEER_DATE DATETIME 

请假设你也有一个名为dbo.TRUNCATE_DATE函数,它的工作原理如下的可用性:

dbo.TRUNCATE_DATE ('23/12/2012 23:59:57.395') ==> 23/12/2012 00:00:00.000 

我想创建一个功能基于索引:

(BEER_CODE, dbo.TRUNCATE_DATE(BEER_DATE)) 

我怎么能ACHI这是吗?

非常感谢您的帮助。

回答

2

您将需要添加一个计算列

Alter Table BEER_HERE Add Column XBEER_DATE As dbo.TRUNCATE_DATE(BEER_DATE) 

然后,您可以索引它,你会期望。

但是,您的功能需要如http://msdn.microsoft.com/en-us/library/ms189292(v=sql.90).aspx中所定义的确定性和精确性。你的函数应该满足这些要求,但你可能需要添加SchemaBinding到函数定义。

您还可能能够使用视图

Create View V_BEER_HERE As Select BEER_CODE, BEER_DATE, dbo.TRUNCATE_DATE(BEER_DATE) As XBEER_DATE From BEER_HERE 
Create Unique Clustered Index PK_V_BEER_HERE On V_BEER_HERE (BEER_CODE) 
Create Index I_XBEER_DATE On V_BEER_HERE (XBEER_DATE) 

东西,插入写入表,东西读取从视图中读取。这取决于BEER_CODE是主键。

SQL Server没有基于功能的索引,这与Oracle所做的相同。

+0

我不知道计算列的工作方式。而且我无法添加列,因为Extract Transform Load包只支持BEER_HERE表的N列,而不支持N + 1列。 – UltraCommit

+1

您可能可以使用视图来实现类似的功能。我已经更新了答案以反映这一点。 – Laurence