Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
Добрый день!

Есть такая ошибка

UPDATE failed because the following SET options have incorrect settings: 'ANSI_WARNINGS'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.


Суть ее в том, что при работе с индексированными представлениями, индексами на вычисляемых столбцах, фильтрующих индексов, уведомлениями запросов, методами типа данных XML и пространственными индексами параметр ANSI_WARNINGS должен быть установлен в ON.

А вот почему эта ошибка вылетает в следующем примере?
set ansi_warnings on
go

if object_id('TestWarnings') is not null
    drop table TestWarnings
go    

create table TestWarnings
(
    T_ID smallint not null identity,
    T_Type int not null,
    T_Date smalldatetime,
    T_Summa1 money,
    T_Summa2 money,
    T_SummaTotal as (isnull(T_Summa1,0) + isnull(T_Summa1,0)) persisted,
    T_ChangeDate smalldatetime,
    
    constraint [PK_TestWarnings] primary key (T_ID),
    constraint [UK_TestWarnings] unique (T_Type, T_Date)
)
go

create 
trigger TestWarnings_Trigger on TestWarnings
for update
as

  set nocount on
  set ansi_warnings off

  if exists(select 1 from inserted i 
                inner join deleted d ON i.T_ID = d.T_ID
            where i.T_Type <> d.T_Type)
    update TestWarnings 
    set T_ChangeDate = GetDate()
    where T_ID in (select 1 from inserted i 
                        inner join deleted d ON i.T_ID = d.T_ID
                    where i.T_Type <> d.T_Type)

GO

insert into TestWarnings(T_Type, T_Date, T_Summa1, T_Summa2)
select 1, '20130501', 10, 5
union
select 2, '20130501', 11, 5
union
select 1, '20130601', 10, 6
go

update TestWarnings
set T_Type = 3 
where T_Date = '20130601'
go


Опытным путем я уже понял, что проблема из-за PERSISTED. Стоит убрать этот параметр, как ошибка сразу исчезает. Но непонятно, почему с установленной опцией ругается. По этому полю нет никаких индексов. Правильно ли я понимаю, что при установке этого параметра вычисляемое поле автоматически входит в состав кластерного индекса и ошибка вылетает из-за работы с индексами на вычисляемых столбцах?
3 июн 13, 12:39    [14383245]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
temp-for-testing,

триггер относится только к записям TestWarnings.T_ID = 1.
Я правильно понимаю?
3 июн 13, 12:43    [14383275]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
iap,

Нет. В данном примере он срабатывает для третьей записи (T_ID там будет равен 3). Ну это и не важно, данные тут все тестовые. Суть в том, что из триггера идет update таблицы с поиском по ключевому полю.
3 июн 13, 12:47    [14383302]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
T_ID там будет равен 3

Хотя вру. Тут T_ID будет равен 2.
3 июн 13, 12:50    [14383328]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
temp-for-testing
T_ID там будет равен 3

Хотя вру. Тут T_ID будет равен 2.
А это как понимать:
where T_ID in (select 1 from inserted i
3 июн 13, 12:52    [14383343]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
temp-for-testing,

SET Options That Affect Results
3 июн 13, 12:52    [14383344]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
iap,

Ой, извините. Ошибка при копировании. Там должно быть i.T_ID
3 июн 13, 12:54    [14383353]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
invm
temp-for-testing,

SET Options That Affect Results
Тут же нет индексированных представлений и индексов по вычисляемому полю.
3 июн 13, 12:54    [14383357]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
invm
temp-for-testing,

SET Options That Affect Results


A computed column is defined and PERSISTED is specified.


Все, понял. Спасибо! Вопрос можно закрывать.
3 июн 13, 12:55    [14383362]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с ANSI_WARNINGS OFF для вычисляемого столбца  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
iap
Тут же нет индексированных представлений и индексов по вычисляемому полю.
Если указано persisted, следовательно значение в столбце должно быть детерминировано. Отсюда и требование к опциям соединения.
3 июн 13, 13:03    [14383442]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить