Я действительно не понимаю, зачем вам здесь нужен курсор. Для вставки во временную таблицу достаточно использовать синтаксис 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'