Можно ли создать временную таблицу в представлении и удалить ее после выбора? - PullRequest
37 голосов
/ 24 ноября 2011

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

Как мне этого добиться?

Ответы [ 3 ]

74 голосов
/ 24 ноября 2011

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

Может быть, общее табличное выражение (CTE) может решить вашу проблему. CTE - это временные наборы результатов, которые определены в области выполнения одного оператора и могут использоваться в представлениях.

Пример (взят из здесь ) - вы можете думать о 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 голос
/ 24 ноября 2011

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

0 голосов
/ 20 сентября 2018

Невозможно, но если вы попробуете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...