从函数调用远程sproc

时间:2013-07-12 02:15:37

标签: sql sql-server openquery sp-executesql

我有一个存储过程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

2 个答案:

答案 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

你应该能够根据自己的情况进行调整。