Принуждение удаленного запроса SQL к удаленной фильтрации вместо локальной - PullRequest
3 голосов
/ 13 октября 2009

У меня есть MS SQL Query, который получает данные с удаленного сервера. Данные, которые я собираю, должны быть отфильтрованы по дате, которая определяется во время выполнения. Когда я запускаю запрос следующим образом:

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

тогда фильтр применяется удаленно ... Однако я на самом деле не хочу использовать «01.01.2009» в качестве даты - я хочу, чтобы дата предоставлялась пользовательской функцией, например так:

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

где функция - это пользовательская скалярная функция CLR, которая возвращает дату и время ... ( Вы можете спросить, зачем мне это делать ... детали немного сложны, поэтому просто поверьте мне - Я должен сделать это так. )

Когда я запускаю этот запрос, удаленный запрос НЕ фильтруется удаленно - фильтрация выполняется после удаления всех данных (400 000 строк против 100 000 строк), и это имеет существенное значение.

Можно ли заставить запрос выполнить фильтрацию удаленно?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 октября 2009

Вы также можете создать строку и использовать открытый запрос ...

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 голос
/ 13 октября 2009

Разве вы не можете просто отправить запрос, подобный этому, или функция clr должна фактически вызываться внутри оператора select?

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

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > @datetime
1 голос
/ 13 октября 2009

Вам необходимо правильно оформить вашу функцию CLR, чтобы пометить ее как Детерминированный, Точный и Доступ к данным / Доступ к системным данным как DataAccessKind.None.

...