Je dois modifier une vue et je veux introduire 2 tables temporaires avant le SELECT.
Est-ce possible? Et comment puis-je le faire?
ALTER VIEW myView
AS
SELECT *
INTO #temporary1
SELECT *
INTO #temporary2
SELECT * FROM #temporary1
UNION ALL
SELECT * FROM #temporary1
DROP TABLE #temporary1
DROP TABLE #temporary2
Quand j'essaye ceci, il se plaint qu'ALTER VIEW doit être la seule instruction du lot.
Comment puis-je atteindre cet objectif?
Non, une vue consiste en une seule instruction SELECT
. Vous ne pouvez pas créer ou supprimer de tables dans une vue.
Peut-être qu'une expression de table common (CTE) peut résoudre votre problème. Les CTE sont des ensembles de résultats temporaires définis dans la portée d'exécution d'une seule instruction et pouvant être utilisés dans des vues.
Exemple (pris de ici ) - vous pouvez considérer le CTE SalesBySalesPerson
comme une table temporaire:
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
Vous pouvez réaliser ce que vous essayez de faire en utilisant un Stored Procedure
qui renvoie un résultat de requête. Views
ne sont pas adaptés/développés pour des opérations comme celle-ci.
Pas possible mais si vous essayez CTE, ce serait le code:
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