【问题标题】:Forcing a SQL Remote Query to filter remotely instead of locally强制 SQL Remote 查询远程过滤而不是本地过滤
【发布时间】:2009-10-12 22:25:08
【问题描述】:

我有一个 MS SQL 查询,它通过远程服务器提取数据。我要下拉的数据需要按运行时确定的日期进行过滤。当我像这样运行查询时:

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

然后远程应用过滤器...但是,我实际上不想使用“2009 年 1 月 1 日”作为日期 - 我希望由用户定义的函数提供日期,如下所示:

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

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

当我运行此查询时,远程查询不会被远程过滤 - 过滤是在所有数据被拉下后完成的(400,000 行与 100,000 行),它产生了显着的差异。

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    你也可以构造一个字符串并使用一个 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
    

    【讨论】:

      【解决方案2】:

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

      Declare @datetime datetime
      Set @datetime = dbo.MyCustomCLRDateFunction()
      
      SELECT * FROM SERVER.Database.dbo.RemoteView
      WHERE EntryDate > @datetime
      

      【讨论】:

      • 你知道什么好玩吗?另一个用户提出了同样的解决方案,但我说我不能这样做,因为查询实际上是由 WTF 数据层动态构建的,该数据层选择它想要查看的列、如何对数据进行分组、如何排序等...我不认为我将能够使用这个答案,因为它都是作为构造查询执行的。但是在更多地观察它时,我认为我在构建它以使该解决方案发挥作用方面几乎没有足够的灵活性。在测试中,它似乎确实有效。
      • 好的,所以我已经在开发环境中成功实现了这个......正如我所想的那样,WTF 系统具有足够的灵活性,我能够在选择之前插入这种类型的代码。这里学到的教训是“不要不加思索就立即放弃可能的解决方案”。谢谢!
      【解决方案3】:

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

      【讨论】:

      • 嗯,我认为将其标记为确定性的,但实际上并非如此......在这种情况下,它会在大多数情况下返回相同的值,但肯定不是所有时间。我不确定其他人是做什么的……你能详细说明一下吗?
      • dbo.MyCustomCLRDateFunction 从哪里制造返回的日期?你查表吗?输出是否取决于当前时间?如果您无法将输出标记为确定性,则几乎没有机会欺骗查询执行以进行远程过滤。
      • 好吧,我实际上是在问这个问题,但事实是我有大约 10 种不同的功能,它们以不同的方式使用。有些取决于时间,有些则不取决于时间,但并非所有这些都保证总是为给定的一组参数返回相同的值。那些是,我一定会这样标记它们。另外,DataAccessKind.None 不是默认的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      相关资源
      最近更新 更多