как вставить дату в TempTable внутри курсора? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть курсор (только для практики и тестирования курсора), и я хочу вставить свой результат в таблицу TempTable. Я пробовал это, но получил эту ошибку.

Предложение INTO не допускается в курсоре декларация.

Мой код:

DECLARE cursor_brand CURSOR FOR
     SELECT firstname, LastName 
     INTO #tempTable_2 
     FROM Person.Person
     JOIN Sales.SalesOrderDetail ON SalesOrderDetail.SalesOrderDetailID = Person.BusinessEntityID
     JOIN Sales.SalesOrderHeader ON SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
     WHERE OrderDate LIKE '%2011%' AND LineTotal > 10000
     ORDER BY LastName

OPEN cursor_brand;

FETCH NEXT FROM cursor_brand

WHILE @@FETCH_STATUS = 0
    FETCH NEXT FROM cursor_brand
    CLOSE cursor_brand
    DEALLOCATE cursor_brand;

1 Ответ

1 голос
/ 28 мая 2020

Я действительно не понимаю, зачем вам здесь нужен курсор. Для вставки во временную таблицу достаточно использовать синтаксис select ... into ..., поэтому я думаю, что весь ваш код следует упростить как:

select p.firstname, p.LastName 
into #tempTable_2
from Person.Person p
join Sales.SalesOrderDetail sod on sod.SalesOrderDetailID = p.BusinessEntityID
join Sales.SalesOrderHeader soh on soh.SalesOrderID = sod.SalesOrderID
where soh.OrderDate like '%2011%' and sod.LineTotal > 10000

Обратите внимание, что я использовал псевдонимы таблиц, чтобы сократить запрос - у меня был сделать предположения о столбцах в предложениях select и where. Если эти предположения верны, то вы выбираете только столбцы person, поэтому я на самом деле не уверен, что этот код делает именно то, что вы хотите: если у человека есть более одной строки, удовлетворяющей условиям salesOrder и salesOrderDetail , то он будет вставлен в временную таблицу более одного раза. Вы можете избежать этого, используя exists вместо join s:

select p.firstname, p.LastName 
into #tempTable_2
from Person.Person p
where exists (
    select 1 
    from Sales.SalesOrderDetail sod
    join Sales.SalesOrderHeader soh on soh.SalesOrderID = sod.SalesOrderID
    where 
        soh.OrderDate like '%2011%' 
        and sod.LineTotal > 10000
        and sod.SalesOrderDetailID = p.BusinessEntityID
)

Наконец, если soh.OrderDate имеет date -подобный тип данных (как и должно), тогда вы должны использовать функции даты, а не строковые функции для его фильтрации. То есть замените это:

soh.OrderDate like '%2011%' 

на:

soh.OrderDate >= '2011-01-01' and soh.OrderDate < '2012-01-01'  
...