Frage

Ich brauche eine Ansicht aus mehreren Tabellen zu erstellen. Eine der Spalten in der Ansicht wird von einer Anzahl von Zeilen aus einem der Tabelle als String mit kommagetrennte Werte werden müssen zusammengesetzt werden.

Hier ist ein vereinfachtes Beispiel dafür, was ich tun möchte.

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)

Es gibt eine Eins-zu-viele-Beziehung zwischen dem Kunden und Bestellungen. So gegeben diese Daten

Customers
1 'John'
2 'Marry'

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

Ich möchte eine Ansicht so sein:

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

Damit JEDER zeigt in der Tabelle nach oben, und zwar unabhängig davon, ob sie Aufträgen oder nicht.

Ich habe eine gespeicherte Prozedur, dass ich zu dieser Ansicht übersetzen müssen, aber es scheint, dass Sie params erklären kippe und gespeicherte Prozeduren innerhalb einer Ansicht aufrufen. Alle Vorschläge, wie diese Abfrage in eine Ansicht zu bekommen?

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
War es hilfreich?

Lösung

Bearbeiten :. Modifizierte Antwort Schaffung Ansicht einschließen

/* 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

Andere Tipps

In SQL Server 2008 können Sie die Vorteile von einigen der Funktionen hinzugefügt für XML nehmen können dies alles in einer Abfrage zu tun, ohne eine gespeicherte Prozedur mit:

 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top