强制SQL远程查询过滤远程而非本地(Forcing a SQL Remote Query to fi

2019-07-22 17:04发布

我有一个是通过从远程服务器拉取的数据的MS SQL查询。 我正在拉低数据需要通过在运行时确定..当我运行这样的查询日期进行筛选:

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > '1/1/2009'

然后将过滤器远程应用......不过,我实际上并不想用“1/1/2009”的日期 - 我想通过用户定义的函数提供的日期,就像这样:

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > dbo.MyCustomCLRDateFunction()

其中函数是一个自定义的CLR标量值函数返回一个日期时间......( 你可能会问,为什么我需要这样做......细节都有点复杂,所以只相信我-我必须这样做,这方式。)

当我运行此查询,远程查询不能远程过滤 - 毕竟数据被拉低(400,000行VS 100,000行)过滤完成,它使一个显著差异。

有没有一种方法,我可以强制查询远程执行过滤操作?

谢谢!

Answer 1:

你就不能发这样的查询,还是在CLR函数必须真正将select语句里面叫什么名字?

Declare @datetime datetime
Set @datetime = dbo.MyCustomCLRDateFunction()

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > @datetime


Answer 2:

你也可以创建一个字符串,并使用OPENQUERY ...

set @sqlString =
 ' select into myTable from openquery
    (remoteServer,
        "SELECT * FROM Database.dbo.RemoteView WHERE EntryDate > %DTSTART"
    )
 '

set @sqlString  = 
    replace(@sqlString, '%DTSTART', 
                        (select cast(dbo.MyCustomCLRDateFunction() as char(8)) 
           )

EXECUTE sp_executesql @stmt=@sqlString


Answer 3:

您需要正确地装点您的CLR函数将其标记为确定性,精确和DataAccessKind.None数据接入/系统的数据访问。



文章来源: Forcing a SQL Remote Query to filter remotely instead of locally