2016-06-22 19 views
1

Ich möchte eine SELECT-Anweisung erstellen, die eine temporäre Tabelle verwendet, aber ich bekomme Fehler über Ansichten möglicherweise keine temporäre Tabellen. Wie kann ich das beheben? Dies ist meine AbfrageWählen Sie eine Anweisung in einer Ansicht aus

CREATE VIEW vwTopStackedItems 
AS 
SELECT COUNT(INVENTORY.itemID) as Stacks, (ITEM.itemID), CHARACTERS.charName  
INTO #Table1 
FROM INVENTORY 
INNER JOIN ITEM 
ON INVENTORY.itemID = ITEM.itemID 
JOIN CHARACTERS 
ON INVENTORY.charID = CHARACTERS.charID 
WHERE INVENTORY.quantity>1 
GROUP BY CHARACTERS.charName, ITEM.itemID 


SELECT [ITEMID], 
    LEFT(column_names , LEN(column_names)-1) AS column_names, 
    SUM([Stacks]) total_stacks 
FROM #Table1 AS extern 
CROSS APPLY 
(
SELECT [charName] + ',' 
    FROM #Table1 intern 
    WHERE intern.[ITEMID] = extern.[ITEMID] 
FOR XML PATH('') 
) pre_trimmed (column_names) 
GROUP BY [ITEMID], column_names; 
GO 
+1

Sie können einfach nicht. Aber ich denke, Sie können ein CTE in einer Ansicht verwenden. – Paparazzi

Antwort

2

Sie können temporäre Tabellen beim Erstellen von Ansichten nicht verwenden. Sie könnten stattdessen einen common-table-expression verwenden. Nicht 100% sicher, es mit cross apply zu verwenden wird aber funktionieren. Wenn nicht, wäre eine andere Option, die temporäre Tabelle stattdessen in Inline-Unterabfragen zu verschieben.

Hier ist mit einem WAK:

CREATE VIEW vwTopStackedItems 
AS 
WITH CTE AS (
    SELECT COUNT(INVENTORY.itemID) as Stacks, (ITEM.itemID), CHARACTERS.charName  
    FROM INVENTORY 
    INNER JOIN ITEM 
    ON INVENTORY.itemID = ITEM.itemID 
    JOIN CHARACTERS 
    ON INVENTORY.charID = CHARACTERS.charID 
    WHERE INVENTORY.quantity>1 
    GROUP BY CHARACTERS.charName, ITEM.itemID 
) 
SELECT [ITEMID], 
    LEFT(column_names , LEN(column_names)-1) AS column_names, 
    SUM([Stacks]) total_stacks 
FROM CTE AS extern 
CROSS APPLY 
(
    SELECT [charName] + ',' 
    FROM CTE intern 
    WHERE intern.[ITEMID] = extern.[ITEMID] 
    FOR XML PATH('') 
) pre_trimmed (column_names) 
GROUP BY [ITEMID], column_names; 
GO 
+0

Oder sehen Sie mit Tabellenwertvariablen. – RThomas

+0

Allerdings, über Ihren Code schauen ... das ist viel eleganter. Nett! – RThomas

+0

Es funktioniert, vielen Dank. Habe gerade gelernt, was einem CTE zu verdanken ist – Tristan

1

Eine Ansicht besteht aus einer einzigen SELECT Aussage. Sie können Tabellen in einer Ansicht nicht erstellen oder löschen.

Wenn Sie etwas tun müssen, versuchen Sie es mit gespeicherten Verfahren.

+0

Dies ist die prägnanteste und offensichtlichste Antwort. Eine Ansicht ist eine "virtuelle Tabelle". Natürlich sollten Sie nichts tun, außer zu wählen, was in dieser virtuellen Tabelle angezeigt werden soll. Wenn Sie in irgendeiner Weise Änderungen an den Quelldaten vornehmen müssen, ist eine Ansicht nicht das richtige Werkzeug. – pzkpfw

0

Views und Functions keine Daten oder schema innerhalb der Datenbank ändern können. Um einen temp table in dieser Kapazität zu verwenden, müssen Sie einen stored procedure verwenden.

Sie könnten eine table variable in einer table valued function verwenden, aber das wird eine anständige Menge an Overhead, die möglicherweise unnötig sein.

Sie können Ihre temp table Anweisung zu einem CTE wechseln und auch wenn es kein temp table erstellen wird, wird es Ihren Code so organisieren, wie Sie möchten.