Точность столбца индексированного представления SQL Server - PullRequest
1 голос
/ 26 ноября 2011

Я пытаюсь создать индексированное представление и получаю следующую ошибку при создании индекса:

Невозможно создать индекс при просмотре ....» потому что столбец «Количество», на который ссылается представление в Предложение WHERE или GROUP BY является неточным. Рассмотрите возможность исключения столбца с точки зрения или изменения столбца, чтобы быть точным.

Столбец, о котором идет речь, имеет тип данных real, который, я полагаю, является проблемой?

Как правильно решить эту проблему? Можно ли выполнить преобразование в представлении SQL для устранения «неточности»?

Представление SQL указано ниже:

EXEC('
   CREATE VIEW model.ReceivableBillableParties
   WITH SCHEMABINDING
   AS
      SELECT pf.Id AS Id
         , pf.InsuranceId AS InsuranceId
         , pf.FinancialInsType AS InsuranceType
         , pr.ReceivableId
      FROM dbo.Receivables pr
      INNER JOIN dbo.Demographics pd ON pd.PersonId = pr.PersonId
      INNER JOIN dbo.Appointments ap ON ap.AppointmentId = pr.AppointmentId
      INNER JOIN dbo.Financiasl pf ON pf.PersonId = pf.PersonId
      INNER JOIN dbo.PracticeInsurers pri ON pri.InsurerId = pf.FinancialInsurerId
      WHERE pri.Amount = 0
')

EXEC('
   CREATE UNIQUE CLUSTERED INDEX [IX_ReceivableBillableParties]
   ON model.ReceivableBillableParties ([Id]);
')

1 Ответ

5 голосов
/ 26 ноября 2011

Документация действительно указывает, что проблема связана с типом данных real (см. Требования к точности). Если вы хотите использовать этот столбец в предложении WHERE вашего представления и индексировать это представление, вам нужно изменить столбец на точный тип данных (т. Е. DECIMAL(9, 2)).

РЕДАКТИРОВАТЬ
Эта документация дает более четкое объяснение того, почему существует такое ограничение. Из раздела «Детерминированные функции»:

Даже если выражение является детерминированным, если оно содержит float выражения, точный результат может зависеть от архитектуры процессора или версия микрокода. Для обеспечения целостности данных такие выражения могут участвовать только в качестве неключевых столбцов индексированных представлений. Детерминированные выражения, которые не содержат выражений с плавающей запятой, называется точным. Только точные детерминированные выражения могут участвовать в ключевых столбцах и в предложениях WHERE или GROUP BY индексированных представлений.

Надеюсь, это поможет.

...