我有一个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行)之后进行过滤,这会产生显着差异。
有没有办法可以强制查询远程进行过滤?
谢谢!
答案 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