Domanda

Devo creare una vista da diverse tabelle.Una delle colonne nella vista dovrà essere composta da un numero di righe da una tabella come una stringa con valori separati da virgole.

Ecco un esempio semplificato di ciò che voglio fare.

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)

Esiste una relazione uno-a-molti tra Cliente e Ordini.Quindi, dati questi dati

Customers
1 'John'
2 'Marry'

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

Voglio che la vista sia così:

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

In modo che TUTTI si presentino al tavolo, indipendentemente dal fatto che abbiano ordini o meno.

Ho una procedura memorizzata che devo tradurre in questa vista, ma sembra che non sia possibile dichiarare parametri e chiamare proc memorizzati all'interno di una vista.Qualche suggerimento su come inserire questa query in 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
È stato utile?

Soluzione

MODIFICARE:Risposta modificata per includere la creazione della 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

Altri suggerimenti

In SQL Server 2008, è possibile usufruire di alcune delle caratteristiche aggiunte per XML per fare tutto questo in una query senza utilizzare un proc memorizzato:

 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top