sql server функциях Возможно ли создать временную таблицу в представлении и удалить ее после выбора?




объявление временной таблицы sql (3)

Мне нужно изменить один вид, и я хочу ввести 2 временных таблицы перед SELECT.

Это возможно? И как я могу это сделать?

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 должен быть единственным заявлением в пакете.

Как я могу это достичь?


Вы можете добиться того, что вы пытаетесь сделать, используя Stored Procedure которая возвращает результат запроса. View s не подходят для таких операций, как этот.


Нет, представление состоит из одной SELECT . Вы не можете создавать или удалять таблицы в представлении.

Возможно, общее табличное выражение (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

Да, это код:

 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 






tsql