Pregunta

En un hilo separado Tengo un ejemplo de trabajo sobre cómo traducir mi almacenada proc a una vista, que contendrá nombres de los clientes a las órdenes de asignación, donde las órdenes son listas separadas por comas de pedidos, incluyendo NULL para no hay órdenes. Así que para la tabla de abajo, necesito que lo siguiente aparezca en la vista:

Name     Orders
'John'   New Hat, New Book, New Phone
'Marry'  NULL

necesito índice de la vista, pero no puedes hacerlo si la consulta SELECT dentro de un punto de vista ha aplicar y / o subconsultas. ¿Es posible traducir este punto de vista a una vista indizada?

create table Customers (CustomerId int, CustomerName VARCHAR(100))
create table Orders    (CustomerId int, OrderName VARCHAR(100))

insert into Customers  (CustomerId, CustomerName) select 1, 'John' union all select 2, 'Marry'
insert into Orders     (CustomerId, OrderName)    select 1, 'New Hat' union all select 1, 'New Book' union all select 1, 'New Phone'
go

create view OrderView as 
select c.CustomerName, x.OrderNames        
from Customers c            
cross apply (select stuff((select ',' + OrderName from Orders o 
      where o.CustomerId = c.CustomerId for xml path('')),1,1,'') 
      as OrderNames) x
go
¿Fue útil?

Solución

No se puede hacer esta vista indizada.

Básicamente, usted está teniendo una función agregada aquí (disfrazado de CROSS APPLY).

Las funciones sólo agregados permitidos en una vista indizada son COUNT_BIG y SUM, ya que distribuyen adición durante conjunto y la resta, que es SUM(a UNION ALL b) = SUM(a) + SUM(b), SUM(a EXCEPT ALL b) = SUM(a) - SUM(b).

Esta propiedad es necesaria para que el índice sea fácil de mantener.

Cuando se inserta un nuevo registro, actualiza o se elimina de la tabla subyacente, no necesita todo el fin de ser reevaluado:. Se acaba de agregar el valor del registro nuevo o se resta del valor agregado

Además, un COUNT_BIG debe ser una parte de la vista, así, para realizar un seguimiento de las supresiones de registros (cuando se convierte en 0, un registro debe suprimirse del índice de vista).

Otros consejos

Si utiliza una combinación interna con 1 = 1 que se cumpla la condición, y permitir la unión.

Seleccione * De x combinación interna y en 1 = 1

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top