Pregunta

necesito para crear una vista de varias tablas. Una de las columnas de la vista tendrá que estar compuesto de un número de filas de una de la tabla como una cadena con valores separados por comas.

Este es un ejemplo simplificado de lo que quiero hacer.

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)

Hay una relación de uno a muchos entre cliente y pedidos. Así que dado estos datos

Customers
1 'John'
2 'Marry'

Orders
1 'New Hat'
1 'New Book'
1 'New Phone'

Quiero miras a ser como este:

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

Así que todo el mundo se muestra en la tabla, independientemente de si tienen o no órdenes.

Tengo un procedimiento almacenado que necesito para traducir este punto de vista, pero parece que no se puede declarar params y llamar a procedimientos almacenados dentro de una vista. Cualquier sugerencia sobre cómo conseguir esta consulta en una vista?

CREATE PROCEDURE getCustomerOrders(@customerId int)
AS
   DECLARE @CustomerName varchar(100)
   DECLARE @Orders varchar (5000)

   SELECT @Orders=COALESCE(@Orders,'') + COALESCE(OrderName,'') + ',' 
   FROM Orders WHERE CustomerId=@customerId

   -- this has to be done separately in case orders returns NULL, so no customers are excluded
   SELECT @CustomerName=CustomerName FROM Customers WHERE CustomerId=@customerId

   SELECT @CustomerName as CustomerName, @Orders as Orders
¿Fue útil?

Solución

editar :. Respuesta modificado para incluir la creación de vista

/* Set up sample data */
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 the view */       
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

/* Demo the view */
select * from OrderView
go 

/* Clean up after demo */
drop view OrderView
drop table Customers
drop table Orders
go

Otros consejos

En SQL Server 2008, puede tomar ventaja de algunas de las características añadidas para XML que hacer todo esto en una consulta sin necesidad de utilizar un procedimiento almacenado:

 SELECT CustomerName,
    STUFF( -- "STUFF" deletes the leading ', '
        ( SELECT ', ' + OrderName
        FROM Orders
        WHERE CustomerId = Customers.CutomerId
        -- This causes the sub-select to be returned as a concatenated string
        FOR XML PATH('') 
        ),
    1, 2, '' )
    AS Orders
 FROM Customers
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top