我需要改变一个视图,我想在SELECT之前引入2个临时表。
这可能吗?我怎么能这样做?
ALTER VIEW myView
AS
SELECT *
INTO #temporary1
SELECT *
INTO #temporary2
SELECT * FROM #temporary1
UNION ALL
SELECT * FROM #temporary1
DROP TABLE #temporary1
DROP TABLE #temporary2
当我尝试这个时,它会抱怨ALTER VIEW必须是批次中的唯一声明。
我怎样才能做到这一点?
答案 0 :(得分:72)
不,视图由单个SELECT
语句组成。您无法在视图中创建或删除表。
也许common table expression(CTE)可以解决您的问题。 CTE是临时结果集,在单个语句的执行范围内定义,可以在视图中使用。
示例(摘自here) - 您可以将SalesBySalesPerson
CTE视为临时表:
CREATE VIEW vSalesStaffQuickStats
AS
WITH SalesBySalesPerson (SalesPersonID, NumberOfOrders, MostRecentOrderDate)
AS
(
SELECT SalesPersonID, COUNT(*), MAX(OrderDate)
FROM Sales.SalesOrderHeader
GROUP BY SalesPersonID
)
SELECT E.EmployeeID,
EmployeeOrders = OS.NumberOfOrders,
EmployeeLastOrderDate = OS.MostRecentOrderDate,
E.ManagerID,
ManagerOrders = OM.NumberOfOrders,
ManagerLastOrderDate = OM.MostRecentOrderDate
FROM HumanResources.Employee AS E
INNER JOIN SalesBySalesPerson AS OS ON E.EmployeeID = OS.SalesPersonID
LEFT JOIN SalesBySalesPerson AS OM ON E.ManagerID = OM.SalesPersonID
GO
答案 1 :(得分:1)
您可以使用返回查询结果的Stored Procedure
来实现您要执行的操作。 Views
不适合/开发此类操作。
答案 2 :(得分:0)
不可能,但是如果您尝试CTE,则代码如下:
ALTER VIEW [dbo].[VW_PuntosDeControlDeExpediente]
AS
WITH TEMP (RefLocal, IdPuntoControl, Descripcion)
AS
(
SELECT
EX.RefLocal
, PV.IdPuntoControl
, PV.Descripcion
FROM [dbo].[PuntosDeControl] AS PV
INNER JOIN [dbo].[Vertidos] AS VR ON VR.IdVertido = PV.IdVertido
INNER JOIN [dbo].[ExpedientesMF] AS MF ON MF.IdExpedienteMF = VR.IdExpedienteMF
INNER JOIN [dbo].[Expedientes] AS EX ON EX.IdExpediente = MF.IdExpediente
)
SELECT
Q1.[RefLocal]
, [IdPuntoControl] = ( SELECT MAX(IdPuntoControl) FROM TEMP WHERE [RefLocal] = Q1.[RefLocal] AND [Descripcion] = Q1.[Descripcion] )
, Q1.[Descripcion]
FROM TEMP AS Q1
GROUP BY Q1.[RefLocal], Q1.[Descripcion]
GO
答案 3 :(得分:0)
尝试创建另一个SQL视图而不是临时表,然后在主SQL视图中引用它。换句话说,视图内的一个视图。完成创建主视图后,您可以放下第一个视图。