Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при создании индекса в EM  [new]
афтаррр
Guest
При создании индекса на вычисляемое поле выдается ошибка
'p20' table
- Unable to create index 'IX_p20_6'.  
ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot create index because the key column 's4_7' is non-deterministic or imprecise.
s4_7 - вычисляемое поле
Что означает эта ошибка и как исправить?
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
12 окт 11, 11:53    [11425511]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
Glory
Member

Откуда:
Сообщений: 104751
афтаррр
Что означает эта ошибка и как исправить?

Надо прочитать в хелпе требования к вычисляемым столбцам используемым в индексах
И выполнить их
12 окт 11, 11:56    [11425549]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
афтаррр
Guest
Glory,

тогда скажите, пожалуйста, почему SQL считает эту функцию не детерминированной.
SET ANSI_NULLS ON
go
SET QUOTED_IDENTIFIER ON
go
CREATE FUNCTION DateWork (@b smalldatetime, @e smalldatetime)
RETURNS int
AS
BEGIN

  DECLARE @r int

  if (@b = @e)
  begin
	set @r = 0
  end

  if (@b < @e)
  begin
	select @r = count(*)
	from Calendar
	where working = 1
	  and cdate between @b and @e
	if (@r > 0)
	begin
		set @r = @r - 1
	end
  end

  if (@b > @e)
  begin
	select @r = count(*)
	from Calendar
	where working = 1
	  and cdate between @e and @b
	if (@r > 0)
	begin
		set @r = @r - 1
		set @r = -@r
	end
  end
 
  RETURN @r
END
12 окт 11, 12:18    [11425729]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы читали требования ?
Whether a user-defined function is deterministic or nondeterministic depends on how the function is coded. User-defined functions are deterministic if:

- The function is schema-bound.
- All built-in or user-defined functions called by the user-defined function are deterministic.
- The body of the function references no database objects outside the scope of the function. For example, a deterministic function cannot reference tables other than table variables that are local to the function.
- The function does not call any extended stored procedures.
12 окт 11, 12:22    [11425762]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
афтаррр
Guest
да, указанным условиям удовлетворяет, для двух дат всегда одно значение возвращает
возможно порядок указания дат не учитывается при определении детерминированности?
12 окт 11, 12:28    [11425802]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
Glory
Member

Откуда:
Сообщений: 104751
афтаррр
да, указанным условиям удовлетворяет, для двух дат всегда одно значение возвращает

Да ??? А - The function is schema-bound тоже ?
12 окт 11, 12:30    [11425813]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
афтаррр
Guest
Glory, не силен в английских терминах, это что?
в русском боле:
Детерминизм
Детерминированные функции каждый раз возвращают один и тот же результат, если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных. Недетерминированные функции могут возвращать каждый раз разные результаты, даже если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных.

Ядро СУБД автоматически анализирует текст функций Transact-SQL и определяет, является ли функция детерминированной. Например, если функция вызывает другие, недетерминированные, функции или если функция вызывает расширенные хранимые процедуры, ядро СУБД помечает ее как недетерминированную. Детерминизм функции CLR определяется ядром СУБД по данным, предоставленным автором функции, который помечает ее как детерминированную или нет с помощью пользовательского атрибута SqlFunction.

больше ничего.. что за схема граница?
12 окт 11, 12:35    [11425853]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
Glory
Member

Откуда:
Сообщений: 104751
Откройте синтаксис команды CREATE FUNCTION и узнаете
12 окт 11, 12:38    [11425869]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
афтаррр
Guest
Glory, вы имеете ввиду опцию SCHEMABINDING ?
12 окт 11, 13:45    [11426477]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании индекса в EM  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
афтаррр, SCHEMABINDING вам слабо поможет, ибо код функции ссылается на таблицу Calendar.
BOL
- The body of the function references no database objects outside the scope of the function. For example, a deterministic function cannot reference tables other than table variables that are local to the function.
12 окт 11, 13:53    [11426556]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить