2013-07-12 37 views
0

我有一個存儲過程SprocA駐留在ServerA上。 SprocA需要4個參數,執行動態sql並返回1列(1個整數值)的記錄。 我希望能夠從ServerB上的函數FnB調用此函數,以便我可以在服務器ServerB上的存儲過程SprocB中使用它來返回記錄集。從函數調用遠程sproc

例如,我想有這樣的事情

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

回答

1

如果您的解決方案基於動態SQL(ServerA.SprocA),則無法在以下調用序列中使用函數,因爲SQL Server將函數視爲確定性函數,並且您無法在函數調用中更改SQL Server狀態。

,如果我是你的地方我會做出LnkSrv.DB_History.dbo.SprocA創建非規範化表(tbl_FnB)與以下(見下文)列insted的返回標值的

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

+0

如果我將PartId傳遞給SprocA,它是否會創建帶有1條記錄的Tbl_FnB。如果是這樣,我的SprocB可能只有1條TotalQtyShipped記錄。如果多個用戶運行SprocB,它是否也會有併發問題? –

+0

您不需要將PartId傳遞給SprocA。您需要爲每個組合生成包含(CustomerId,PartId,DateFrom,DateTo)和相應TotalQtyShipped值的所有可能組合的「原始」表。最後加入這張表。 –

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',@[email protected] output 
select @RowCnt 

你應該能夠適應這對於你自己的情況。

+0

我試過這種方式,它給了我這個錯誤「只有函數和一些擴展存儲過程可以在函數內執行」 –