强制SQL Remote Query远程过滤而不是本地过滤

时间:2009-10-12 22:25:08

标签: sql sql-server tsql sql-server-2008 query-optimization

我有一个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行与100,000行)之后进行过滤,这会产生显着差异。

有没有办法可以强制查询远程进行过滤?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您需要properly decorate您的CLR功能将其标记为确定性,精确和数据访问/系统数据访问为DataAccessKind.None。

答案 2 :(得分:1)

你不能只发送这样的查询,还是必须在select语句中实际调用clr函数?

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

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