2014-01-28 70 views
0

我有一個本地存儲過程在遠程鏈接服務器上調用另一個。問題是我的本地存儲過程使用openquery來調用遠程存儲的proc並傳遞兩個參數DATETIME通過openquery傳遞連接的日期時間參數

我能夠成功調用遠程存儲過程的唯一方法是連接查詢及其參數,然後使用sp_executesql - 注意RPC未在遠程服務器上啓用,它僅限制成功的方法。

問題是連接日期時間以將它們作爲變量傳遞在遠程過程中導致問題,該過程期望datetime params而不是nvarchar,這是串聯正在進行的過程。

有沒有辦法解決這個問題?最後的辦法是修改遠程過程並讓它接受nvarchar,然後立即將它們轉換爲datetime。由於遠程過程在其他系統中使用,這不是一種可行的方法。

本地SP

ALTER PROCEDURE [dbo].[GetAttendanceReport] 
    @StartDate datetime, 
    @EndDate datetime, 
    @paramDef nvarchar(500) = N'@StartDate datetime, @EndDate datetime', 
    @query nvarchar(500) = null 
AS 
BEGIN 
    SET NOCOUNT ON; 

    set @query = N'select * from OPENQUERY([REMOTE-SRV], ''EXEC db.dbo.ReportAttendance_sp ' + convert(nvarchar(30), @StartDate, 112) + ',' + convert(nvarchar(30), @EndDate, 112) + ''')' 
    exec sp_executesql @query, @paramDef, @StartDate, @EndDate 
END 

遠程SP

ALTER PROCEDURE [dbo].[ReportAttendance_sp] 
    @VenueID int = null, 
    @StartDate datetime = null, 
    @EndDate datetime = null, 
    @AttendanceStatusID int = null 
AS 
BEGIN 
... 

我通過以下PARAMS:

@StartDate = N'2011-01-01', 
@EndDate = N'2012-01-01' 

執行的SP我從一開始的錯誤遠程SP:

將數據類型int轉換爲datetime時出錯。

回答

1

您需要傳遞這些連接的參數,就好像它們是字符串一樣。目前,它們看起來像整數,因爲錯誤消息意味着 - 您需要將單引號加倍以將它們嵌入爲字符串分隔符,然後再次,因爲它們在動態SQL內。另外,沒有理由爲這些文字特別使用NVARCHAR,也不需要30個字符來表示樣式112.您只需使用CHAR(8)。最後,如果你實際上沒有將它們中的任何一個用作強類型參數(我認爲你可以在動態SQL下與OPENQUERY結合使用),則不需要將參數傳遞給sp_executesql。所以:

SET @query = N'SELECT * from OPENQUERY([REMOTE-SRV], 
    ''EXEC db.dbo.ReportAttendance_sp ''''' + convert(char(8), @StartDate, 112) 
     + ''''',''''' + convert(char(8), @EndDate, 112) + ''''';'');'; 

EXEC sp_executesql @sql; 

(當然,你真的應該明確命名的參數,它至少可以保護你免受後來有人改變接口,例如,通過添加參數帕拉姆列表的開頭。)

然而,這引出了一個問題,爲什麼不解決RPC問題,然後:

EXEC [REMOTE-SRV].db.dbo.ReportAttendance_sp @StartDate, @EndDate; 
+0

爲什麼IT部門去決定你是否可以在鏈接的服務器,這似乎是你的實際業務需求,執行存儲過程這裏? –

+0

我沒有意識到啓用RPC與在屬性下將其設置爲true一樣微不足道。從現在起將是多麼簡單的事情:) – Lee