2016-08-23 3 views
3

Ich möchte eine Tabelle erstellen, um Ergebnismenge einer anderen Abfrage zu speichern.Wie erstellt man eine Tabelle mit Ergebnismenge in SQL-Server

Ich habe dies versucht:

create table avgcost_product (
    name varchar(50), 
    productnumber varchar(50), 
    averagecost money 
) 

Nach Tabelle erstellt habe ich versucht, diese Abfrage:

INSERT into avgcost_product SELECT * FROM 
(SELECT p.[Name], p.ProductNumber, 
     CONVERT(varchar, cost.AvgCost,1) as 'Average Cost' 
FROM Production.Product p 
CROSS APPLY fnGetAvgCost(p.ProductID) as cost 
WHERE cost.AvgCost IS NOT NULL 
ORDER BY cost.AvgCost desc) 

Aber es zeigt Fehler wie:

Msg 1033, Ebene 15, Status 1, Linie 284

Die ORDER BY cl ause ist in Views, Inline-Funktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken ungültig, es sei denn, TOP, OFFSET oder FOR XML werden ebenfalls angegeben.

Wie kann ich Daten schreiben, die ich in meiner Tabelle brauche?

+1

Ja, es ist Ihnen zu sagen, dass das 'ORDER BY' sinnlos ist. Tabellen ** haben keine inhärente Reihenfolge. –

Antwort

5

einfach die ORDER BY von der inneren wählen entfernen oder Sie können Ihre Anfrage noch einmal vereinfachen:

INSERT into avgcost_product 
SELECT p.[Name] 
     , p.ProductNumber 
     , CONVERT(varchar, cost.AvgCost,1) as 'Average Cost' 
FROM Production.Product p 
CROSS APPLY fnGetAvgCost(p.ProductID) as cost 
WHERE cost.AvgCost IS NOT NULL 
+3

Nur um das hinzuzufügen. SQL per Definition speichert Daten nicht in einer bestimmten Reihenfolge. Deshalb ist es so wichtig, ORDER BY zu verwenden, wenn Sie die Daten tatsächlich abrufen, wenn Sie sie in einer bestimmten Reihenfolge wünschen. –

0

Auch können Sie die Tabelle auf der Fliege mit SELECT INTO erstellen:

SELECT p.[Name], 
     p.ProductNumber, 
     CONVERT(varchar, cost.AvgCost,1) as [Average Cost] 
INTO avgcost_product 
FROM Production.Product p 
CROSS APPLY fnGetAvgCost(p.ProductID) as cost 
WHERE cost.AvgCost IS NOT NULL 
Verwandte Themen