我有一个存储过程SprocA驻留在ServerA上。 SprocA接受4个参数,执行动态sql并返回1列(1个整数值)的记录。 我希望能够从ServerB上的函数FnB调用它,以便我可以在服务器ServerB上的存储过程SprocB中使用它来返回记录集。
例如,我想要这样的东西
Create Function FnB
@CustomerId int
,@PartId varchar(30)
,@DateFrom datetime
,@DateTo datetime
Returns int
As
Begin
Declare @Ret int
Exec @Ret = LnkSrv.DB_History.dbo.SprocA(@CustomerId, @PartId, @DateFrom, @DateTo)
Return @Ret
End --FnB
Create Procedure SprocB
@RowId int
As
Begin
Select Partid, FnB(Customerid, Partid, DateFrom, DateTo) As TotalQtyShipped
, AskedPrice, AskedQty, AppvPrice, AppvQty
From Tbl_Header a
Inner Join Tbl_Detail b On a.RowID = b.RowID
Where a.RowID = @RowId
End --SprocB
可能的结果:
PartID TotalQtyShipped AskedPrice AskedQty AppvPrice AppQty
pn1 1000 10 100 10 100
pn2 550 20 50 15 50
pn3 2000 5 2000 5 1500
请帮忙
TL
答案 0 :(得分:1)
如果您的解决方案基于动态SQL(ServerA.SprocA),则您无法在以下调用序列中使用函数,因为SQL Server将函数视为确定性函数,并且您无法在函数调用中更改SQL Server状态。 / p>
如果我在你的位置,我已经 LnkSrv.DB_History.dbo.SprocA 创建了非规范化表格( tbl_FnB ),其中包含以下(见下文)列返回标量值
CustomerId PartId DateFrom DateTo TotalQtyShipped
然后SprocB看起来像这样
Create Procedure SprocB
@RowId int
As
Begin
exec LnkSrv.DB_History.dbo.SprocA; -- creates table Tbl_FnB on its side
Select Partid, Tbl.TotalQtyShipped
, AskedPrice, AskedQty, AppvPrice, AppvQty
From Tbl_Header a
Inner Join Tbl_Detail b On a.RowID = b.RowID
Inner Join LnkSrv.DB_History.dbo.Tbl_FnB f On f.CustomerId = b.Customerid
and f.Partid = b.Partid
and f.DateFrom = b.DateFrom
and f.DateTo = b.DateTo
Where a.RowID = @RowId
End --SprocB
我认为位于 Tbl_Detail 表中的字段CustomerId PartId DateFrom DateTo
答案 1 :(得分:0)
除了你不能在函数中使用execute之外,你所要求的并没有真正的问题;
但你可以这样做:
create proc [dbo].[GetRowCount] (@TblName NVARCHAR(25) , @Itemid INT,@RowCnt int = 0)
AS BEGIN
DECLARE @Sqlstring nvarchar(2000)
set @Sqlstring = 'SELECT @RowCnt = COUNT(*) FROM ['+ @TblName +']
WHERE Itemid = '+ convert(varchar(10),@Itemid)
EXEC sp_executesql @Sqlstring,N'@RowCnt int output',@RowCnt output
END
...
declare @RowCnt int
exec [GetRowCount] @TblName='TableName',@Itemid='ItemID',@RowCnt=@RowCnt output
select @RowCnt
你应该能够根据自己的情况进行调整。