4

请假设您有一个名为 BEER_HERE 的表,其中包含两列:

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))

我怎么能做到这一点?

预先感谢您的帮助。

4

1 回答 1

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中定义的那样具有确定性和精确性。您的函数应该满足这些要求,但您可能需要将 With 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 那样具有基于函数的索引。

于 2012-10-22T15:06:17.030 回答