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
Views
和 Functions
不能修改数据库中的数据或 schema
。因此,要以这种身份使用 temp table
,您需要使用 stored procedure
.
您可以在 table valued function
中使用 table variable
,但这将是相当大的开销,可能是不必要的。
您可以将 temp table
语句切换为 CTE
,即使它不会创建 temp table
,它也会按照您想要的方式组织代码。
我想创建一个使用临时 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
Views
和 Functions
不能修改数据库中的数据或 schema
。因此,要以这种身份使用 temp table
,您需要使用 stored procedure
.
您可以在 table valued function
中使用 table variable
,但这将是相当大的开销,可能是不必要的。
您可以将 temp table
语句切换为 CTE
,即使它不会创建 temp table
,它也会按照您想要的方式组织代码。