我有一個本地存儲過程在遠程鏈接服務器上調用另一個。問題是我的本地存儲過程使用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時出錯。
爲什麼IT部門去決定你是否可以在鏈接的服務器,這似乎是你的實際業務需求,執行存儲過程這裏? –
我沒有意識到啓用RPC與在屬性下將其設置爲true一樣微不足道。從現在起將是多麼簡單的事情:) – Lee