4

2 つの列を持つ 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

FUNCTION BASED INDEX を作成したいと思います:

(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 に答える