首页 文章

在SQL Server 2000中的视图中返回表的调用函数

提问于
浏览
0
  • SQL Server - 兼容级别2000

  • Person 表 - PersonId,PersonName等..(~1200条记录)

两个用户功能 - GetPersonAddress(@PersonId)GetPaymentAddress(@PersonId)

这两个函数在带有Street,City等的表中返回数据...( PersonId 的返回表中有一条记录)

我必须通过传入person id来创建一个通过这两个用户函数连接person表的视图 .

限制:

  • SQL Server 2000中的函数不支持Cross Apply

  • 视图中不支持游标,临时表和临时变量,因此我可以循环访问人员表并调用函数 .

有人可以帮忙吗?

2 回答

  • 0

    您可以创建函数 GetPeopleAddresses()GetPaymentsAddresses() ,将PersonId作为字段返回,然后您可以在 JOIN 中使用它们:

    SELECT t.PersonId, PersonName, etc..., a1.Address, a2.Address
    FROM YourTable t 
      LEFT JOIN GetPeopleAddresses() a1 ON a1.PersonId = t.PersonId
      LEFT JOIN GetPaymentsAddresses() a2 ON a2.PersonId = t.PersonId
    

    当然,您的函数必须只返回唯一的记录

  • 0

    由于您列出的限制,我担心您无法使用SQL Server 2000中的视图执行此操作 . 注释中建议的下一个最佳选项是存储过程,该过程返回将返回视图的行 .

    如果需要在另一个查询中使用该过程的结果,则可以在过程表中插入过程返回的值 . 不漂亮,你必须进行两次DB调用(一个用于创建/填充临时表,另一个用于使用它),但它可以工作 . 例如:

    create table #TempResults (
      PersonID int not null,
      Name varchar(100),
      Street varchar(100),
      City varchar(100),
    
      <all the other fields>
    
      constraint primary key PK_TempResults (PersonID)
    )
    
    insert into #TempResults
    exec spTheProcedureThatReplaceTheView @thePersonID
    go -- end of the first DB call
    
    
    select <fields>
    from AnotherTable
    join #TempResults on <condition>
    
    -- don't forget to drop table when you don't need its current data anymore
    drop table #TempResults
    

相关问题