如何在游标内插入日期?

1sbrub3j  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(316)

我有一个游标(只是为了练习和测试游标),我想插入我的结果到诱惑我尝试了这个,但我得到了这个错误
游标声明中不允许使用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;
zmeyuzjn

zmeyuzjn1#

我真的不明白你为什么需要光标。使用 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 ,则会在temp表中多次插入。你可以通过使用 exists 而不是 join 学生:

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'

相关问题