Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR и Indexed View  [new]
Stimo
Member

Откуда: Leeds
Сообщений: 814
Всем привет.

Решили создать 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)
Вот этого он делать не позволяет.
3 июн 11, 18:50    [10761271]     Ответить | Цитировать Сообщить модератору
 Re: CLR и Indexed View  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Интересно.
XML и hierarchyid вроде как системные CLR. Можно оттуда "описалово" подглядеть. Хотя не уверен, что на их функциях можно индексировать.

А что за функция такая что CLR понадобился? Или изучаете возможности?
4 июн 11, 02:06    [10762433]     Ответить | Цитировать Сообщить модератору
 Re: CLR и Indexed View  [new]
Stimo
Member

Откуда: Leeds
Сообщений: 814
Функция ищет подстроку в текста используя регулярные выражения
5 июн 11, 19:44    [10765606]     Ответить | Цитировать Сообщить модератору
 Re: CLR и Indexed View  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Мда.
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. И где здесь регулярки?
5 июн 11, 23:45    [10766336]     Ответить | Цитировать Сообщить модератору
 Re: CLR и Indexed View  [new]
Stimo
Member

Откуда: Leeds
Сообщений: 814
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. И где здесь регулярки?
Я просто воспроизвел проблему с минимумом кода для форума, регулярки убрал, так как проблема не в них. Приведенный код - просто пример.
7 июн 11, 00:43    [10773953]     Ответить | Цитировать Сообщить модератору
 Re: CLR и Indexed View  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Stimo, Ссори не внимателен.
Судя по всему 4-ре обязательных свойства указаны. Контрольный в голову:
SELECT ObjectProperty(Object_ID('dbo.AddOne'),'IsDeterministic')
Может правило верно и для не кластерного. :)

Связанный топик.
7 июн 11, 08:45    [10774362]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить