Select 进入视图中的语句

Select into statement in a view

我想创建一个使用临时 table 的 select 语句的视图,但我收到关于视图可能没有临时 table 的错误。我该如何解决这个问题?这是我的查询

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

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

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

创建视图时不能使用临时 tables。您可以尝试使用 common-table-expression 代替。不能 100% 确定将它与 cross apply 一起使用会起作用。如果不是,另一种选择是将临时 table 移动到内联子查询。

这是一个 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

ViewsFunctions 不能修改数据库中的数据或 schema。因此,要以这种身份使用 temp table,您需要使用 stored procedure.

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

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