2

一時テーブルを使用する select ステートメントのビューを作成したいのですが、ビューに一時テーブルがない可能性があるというエラーが表示されます。どうすればこれを解決できますか? これは私のクエリです

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
4

3 に答える 3

2

ビューの作成時に一時テーブルを使用することはできません。common-table-expression代わりにa を使用してみてください。ただし、それを使用すると100%cross applyうまくいくとは限りません。そうでない場合は、代わりに一時テーブルをインライン サブクエリに移動するという別のオプションがあります。

ここにCTEがあります:

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
于 2016-06-22T17:01:48.157 に答える
1

ビューは 1 つのSELECTステートメントで構成されます。ビューでテーブルを作成または削除することはできません。

そのようなことをする必要がある場合は、ストアド プロシージャを使用してみてください。

于 2016-06-22T16:56:34.513 に答える
0

Viewsまた、Functionsデータまたはschemaデータベース内を変更することはできません。したがってtemp table、この容量で a を使用するには、a を使用する必要がありますstored procedure

table variableaを a で使用することもできますがtable valued function、それは不必要なかなりの量のオーバーヘッドになります。

temp tableステートメントを に切り替えるCTEと、 が作成されなくてもtemp table、コードを思いどおりに編成できます。

于 2016-06-22T17:02:25.077 に答える