在 SQL Server 2000 的视图中调用 returns table 的函数
Call function that returns table in a view in SQL Server 2000
- SQL 服务器 - 兼容级别 2000
Person
table - PersonId、PersonName 等(~1200 条记录)
两个用户函数 - GetPersonAddress(@PersonId)
、GetPaymentAddress(@PersonId)
这两个函数 return 数据在一个 table 中有 Street, City 等...(return table 中的一个记录为 PersonId
)
我必须创建一个视图,通过传入人员 ID 将人员 table 与这两个用户函数连接起来。
限制:
- SQL Server 2000
中的函数不支持交叉应用
- 视图中不支持游标、临时变量 table 和临时变量,因此我可以循环访问此人 table 并调用函数。
有人可以帮忙吗?
您可以创建函数 GetPeopleAddresses()
和 GetPaymentsAddresses()
,其中 return 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
当然,你的函数必须return只有唯一记录
由于您列出的限制,恐怕您无法使用 SQL Server 2000 中的视图执行此操作。评论中建议的下一个最佳选择是一个存储过程,该过程 returns 将 return 视图的行。
如果您需要在另一个查询中使用该过程的结果,您可以在临时 table 中插入由该过程编辑的值 return。不是很漂亮,你必须进行两次数据库调用(一个用于 creating/populating 临时 table,另一个用于使用它),但它有效。例如:
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
- SQL 服务器 - 兼容级别 2000
Person
table - PersonId、PersonName 等(~1200 条记录)
两个用户函数 - GetPersonAddress(@PersonId)
、GetPaymentAddress(@PersonId)
这两个函数 return 数据在一个 table 中有 Street, City 等...(return table 中的一个记录为 PersonId
)
我必须创建一个视图,通过传入人员 ID 将人员 table 与这两个用户函数连接起来。
限制:
- SQL Server 2000 中的函数不支持交叉应用
- 视图中不支持游标、临时变量 table 和临时变量,因此我可以循环访问此人 table 并调用函数。
有人可以帮忙吗?
您可以创建函数 GetPeopleAddresses()
和 GetPaymentsAddresses()
,其中 return 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
当然,你的函数必须return只有唯一记录
由于您列出的限制,恐怕您无法使用 SQL Server 2000 中的视图执行此操作。评论中建议的下一个最佳选择是一个存储过程,该过程 returns 将 return 视图的行。
如果您需要在另一个查询中使用该过程的结果,您可以在临时 table 中插入由该过程编辑的值 return。不是很漂亮,你必须进行两次数据库调用(一个用于 creating/populating 临时 table,另一个用于使用它),但它有效。例如:
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