0

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

4

2 回答 2

1

如果您的解决方案基于动态 SQL (ServerA.SprocA),则您根本无法在以下调用序列中使用函数,因为 SQL Server 将函数视为确定性,您无法在函数调用中更改 SQL Server 状态。

如果我在你的位置,我会让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

我假设CustomerId PartId DateFrom DateTo位于Tbl_Detail表中的字段

于 2013-07-12T06:20:39.000 回答
0

您所要求的没有真正的问题,只是您不能在函数中使用执行,因为您拥有它;

但是,您可以这样做:

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

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

于 2013-07-12T04:58:29.350 回答