Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过openquery传递连接的日期时间参数_Sql_Sql Server 2008 - Fatal编程技术网

Sql 通过openquery传递连接的日期时间参数

Sql 通过openquery传递连接的日期时间参数,sql,sql-server-2008,Sql,Sql Server 2008,我有一个本地存储过程,它调用远程链接服务器上的另一个存储过程。问题是我的本地存储过程使用openquery调用远程存储过程并传递两个DATETIME参数 成功调用远程存储过程的唯一方法是连接查询及其参数,然后使用sp_executesql-注意远程服务器上未启用RPC,这只会限制成功的方法 问题在于,为了将日期时间作为变量传递而将其串联在一起会在远程进程中造成问题,远程进程需要datetimeparams而不是nvarchar,这就是串联所做的 这有什么办法吗?最后一种方法是修改远程进程,让它接

我有一个本地存储过程,它调用远程链接服务器上的另一个存储过程。问题是我的本地存储过程使用
openquery
调用远程存储过程并传递两个
DATETIME
参数

成功调用远程存储过程的唯一方法是连接查询及其参数,然后使用
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
ALTER PROCEDURE [dbo].[ReportAttendance_sp] 
    @VenueID int = null,
    @StartDate datetime = null,
    @EndDate datetime = null,
    @AttendanceStatusID int = null
AS
BEGIN
...
远程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
ALTER PROCEDURE [dbo].[ReportAttendance_sp] 
    @VenueID int = null,
    @StartDate datetime = null,
    @EndDate datetime = null,
    @AttendanceStatusID int = null
AS
BEGIN
...
我传递以下参数:

@StartDate = N'2011-01-01',
@EndDate = N'2012-01-01'
执行SP I从远程SP获取错误:

将数据类型int转换为datetime时出错


您需要像传递字符串一样传递这些连接的参数。目前,它们看起来像INT,正如错误消息所暗示的——您需要将单引号加倍以将它们嵌入为字符串分隔符,然后再次插入,因为它们位于动态SQL中。此外,没有理由专门为这些文本使用NVARCHAR,也不需要30个字符来表示样式112。您只需要使用CHAR(8)。最后,如果您实际上没有将任何参数用作强类型参数(我认为您不能在动态SQL下与OPENQUERY结合使用),则不需要将参数传递给sp_executesql。因此:

(当然,您确实应该显式地命名这些参数,这至少可以防止以后有人更改接口,例如在参数列表的开头添加一个参数。)

但是,这就引出了一个问题,为什么不修复RPC问题,然后:

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

为什么IT部门要规定您是否可以跨链接服务器执行存储过程,这似乎是您在这里的实际业务需求?我没有意识到启用RPC与在属性下将其设置为true一样简单。从现在起事情将变得多么简单:)