3 votes

Forcer une requête SQL à distance à filtrer à distance au lieu de localement

J'ai une requête MS SQL qui extrait des données d'un serveur distant. Les données que j'extrais doivent être filtrées en fonction d'une date qui est déterminée au moment de l'exécution. Lorsque je lance la requête comme ceci :

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

puis le filtre est appliqué à distance... Cependant, je ne veux pas utiliser '1/1/2009' comme date - je veux que la date soit fournie par une fonction définie par l'utilisateur, comme ceci :

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

où la fonction est une fonction personnalisée CLR à valeur scalaire qui renvoie une date et une heure... ( Vous vous demandez peut-être pourquoi je dois faire cela... les détails sont un peu compliqués, alors faites-moi confiance - je dois le faire de cette façon. )

Lorsque j'exécute cette requête, la requête distante n'est PAS filtrée à distance - le filtrage est effectué après que toutes les données ont été extraites (400 000 lignes contre 100 000 lignes) et la différence est significative.

Existe-t-il un moyen de forcer la requête à effectuer le filtrage à distance ?

Merci !

2voto

cindi Points 1351

Vous pouvez également construire une chaîne de caractères et utiliser un 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

1voto

Remus Rusanu Points 159382

Vous devez bien décorer votre fonction CLR pour la marquer comme déterministe, précise et accès aux données/accès aux données du système comme DataAccessKind.None.

1voto

Gordon Tucker Points 2436

Ne pouvez-vous pas simplement envoyer une requête comme celle-ci, ou la fonction clr doit-elle être appelée dans l'instruction select ?

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X