CLR и Indexed View

Stimo
Дата: 03.06.2011 18:50:55
Всем привет.

Решили создать indexed view с использованием CLR функции. Все, вроде, нормльно, кластерный индекс на вьюшке создается, но при попытке создать некластерный индекс на CLR поле, говорит:

Cannot create index or statistics 'Ix_IndexedView_One' on view 'vwIndexedViewTest' because cannot verify key column 'idPlusOne' is precise and deterministic. Consider removing column from index or statistics key, marking column persisted in base table if it is computed, or using non-CLR-derived column in key.

БОЛ говорит, что CLR поля не могут быть частью кластерного индекса, но про некластерные ничего не говорит.

Кому интересно, могут попробовать:

create table [dbo].[IndexedViewTest](
	[id] [int] identity(1,1) not null,
	[name] [varchar](50) null
	constraint PK_id primary key clustered 
	(
		[id] asc
	)
)

Метод помечен как deterministic и precise, что и требуется.
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true,IsPrecise=true, DataAccess=DataAccessKind.None, SystemDataAccess=SystemDataAccessKind.None)]
    public static SqlInt32 AddOne(SqlInt32 number)
    {
        return number + 1;
    }

create view dbo.vwIndexedViewTest
with schemabinding
as
select id, name, convert(int, dbo.AddOne(1)) as idPlusOne
from dbo.IndexedViewTest

go

create unique clustered index Ix_IndexedView on vwIndexedViewTest(id)

Теперь пытаемся создать ещё один некластерный индекс
create nonclustered index Ix_IndexedView_One on vwIndexedViewTest(idPlusOne)
Вот этого он делать не позволяет.
Mnior
Дата: 04.06.2011 02:06:03
Интересно.
XML и hierarchyid вроде как системные CLR. Можно оттуда "описалово" подглядеть. Хотя не уверен, что на их функциях можно индексировать.

А что за функция такая что CLR понадобился? Или изучаете возможности?
Stimo
Дата: 05.06.2011 19:44:28
Функция ищет подстроку в текста используя регулярные выражения
Mnior
Дата: 05.06.2011 23:45:55
Мда.
Stimo
CREATE VIEW [dbo].[vwIndexedViewTest] WITH SCHEMABINDING AS
SELECT	 ID
	,Name
	,Convert(Int,dbo.AddOne(1))	AS IDPlusOne
FROM	dbo.IndexedViewTest
GO
...Вот этого он делать не позволяет (так и пишет "Пе позволяю!"?).
...регулярные выражения
1. Ошибку вы не представили.
2. С каких пор Convert детерминированый?
2. Зачем вообще нужен этот Convert?
3. И где здесь регулярки?
Stimo
Дата: 07.06.2011 00:43:31
Mnior,

>>1. Ошибку вы не представили.
Да вот же она, в первом посте:
Cannot create index or statistics 'Ix_IndexedView_One' on view 'vwIndexedViewTest' because cannot verify key column 'idPlusOne' is precise and deterministic. Consider removing column from index or statistics key, marking column persisted in base table if it is computed, or using non-CLR-derived column in key.


>>2. С каких пор Convert детерминированый?
Насколько я помню, давно. Он не детерминистик только при работе sql_variant, (small)datetime и ещё в парочке других случаев.

>>3. Зачем вообще нужен этот Convert?
Он не нужен, это я игрался и забыл убрать. Сори.

>>4. И где здесь регулярки?
Я просто воспроизвел проблему с минимумом кода для форума, регулярки убрал, так как проблема не в них. Приведенный код - просто пример.
Mnior
Дата: 07.06.2011 08:45:53
Stimo, Ссори не внимателен.
Судя по всему 4-ре обязательных свойства указаны. Контрольный в голову:
SELECT ObjectProperty(Object_ID('dbo.AddOne'),'IsDeterministic')
Может правило верно и для не кластерного. :)

Связанный топик.