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

创建视图时不能使用临时表。您可以尝试使用 acommon-table-expression代替。不是 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

视图由单个SELECT语句组成。您不能在视图中创建或删除表。

如果您需要执行类似的操作,请尝试使用存储过程。

于 2016-06-22T16:56:34.513 回答
0

Views并且Functions不得修改数据或schema在数据库中。因此,要temp table以这种能力使用 a ,您需要使用 a stored procedure

您可以使用 a table variablein a table valued function,但这将是相当大的开销,可能是不必要的。

您可以将temp table语句切换为 a CTE,即使它不会创建 a temp table,它也会按照您想要的方式组织您的代码。

于 2016-06-22T17:02:25.077 回答