2010-11-17 3 views
1

Когда я пытаюсь создать индексированный вид, я получаю сообщение об ошибке «datepart возвращает индетерминированное значение, использует определенную систему детерминированной функции или возвращает функцию, определенную пользователем, для определения детерминированного значения». Я получаю эту ошибку, когда пытаюсь создать индекс на представлении ..Создание индексированных представлений

Этот запрос

CREATE VIEW dbo.two_weeks_performance WITH SCHEMABINDING 
as 
    SELECT dbo.day_dim.date_time AS Date, dbo.order_dim.quantity AS Target_Acheived 
    FROM dbo.day_dim 
    JOIN dbo.order_fact ON dbo.day_dim.day_id = dbo.order_fact.day_id 
    JOIN dbo.branch_dim ON dbo.order_fact.branch_id = dbo.branch_dim.branch_id 
    JOIN dbo.order_dim ON dbo.order_fact.order_id = dbo.order_dim.order_id 
    WHERE (DATEPART(wk, CONVERT(datetime, dbo.day_dim.date_time, 101)) <= DATEPART(wk, GETDATE() - 2)) 
GROUP BY dbo.order_dim.quantity, dbo.day_dim.date_time 
GO 
CREATE UNIQUE CLUSTERED INDEX two_weeks_performance_I on two_weeks_performance (Date,Target_Acheived)` 

В этом DATE_TIME является VARCHAR (30) типа. Дайте мне решение проблемы.

ответ

1

Использование:

CREATE VIEW dbo.two_weeks_performance WITH SCHEMABINDING 
AS 
    SELECT dbo.day_dim.date_time AS Date, 
     dbo.order_dim.quantity AS Target_Acheived 
    FROM dbo.day_dim 
    JOIN dbo.order_fact ON dbo.day_dim.day_id = dbo.order_fact.day_id 
    JOIN dbo.branch_dim ON dbo.order_fact.branch_id = dbo.branch_dim.branch_id 
    JOIN dbo.order_dim ON dbo.order_fact.order_id = dbo.order_dim.order_id 
GROUP BY dbo.order_dim.quantity, dbo.day_dim.date_time 

Этот вопрос использование GETDATE(); он не является детерминированным, каждый раз возвращает другое значение.

Таким образом, вы должны были бы использовать:

SELECT t.* 
    FROM dbo.two_weeks_performance t 
WHERE DATEPART(wk, CONVERT(datetime, t.date, 101)) <= DATEPART(wk, GETDATE() - 2) 
+0

Но я хочу, чтобы отфильтровать результаты, прежде чем создавать вид. Я хочу, чтобы только недавний отчет за 2 недели пошел в точку зрения. Любые решения для этого? – Deepak

+0

@ Deepak: Вы не можете, если хотите использовать недетерминированное значение - это одна из основных проблем с материализованными/индексированными представлениями. Использование DATEPART/etc также не сможет использовать индекс, созданный на представлении. –

+0

так что это ограничение, не так ли? и что произойдет, если я удалю dbo.order_dim.quantity из предложения group by и добавлю SUM() рядом с select? – Deepak