web-dev-qa-db-fra.com

Est-il possible de créer une table temporaire dans une vue et de la déposer après sélection?

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?

35
pencilCake

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
66
Marek Grzenkowicz

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.

1
Emir Akaydın

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
0
Ángel Ibáñez