J'utilise Microsoft SQL Server 2005. J'ai besoin de synchroniser les données entre le serveur SQL et une base de données Oracle. La première chose dont j'ai besoin est de savoir si le nombre de données sur Oracle côté avec certains filtres (ici j'utilise ID comme un exemple simple). Le problème que j'ai est que la table sur le serveur ligné ou Oracle est très grande avec 4M lignes de données. La requête ci-dessus a pris environ 2 minutes pour récupérer les données. Ce code est juste une pièce simplifiée. En fait, mon SP a d'autres requêtes à mettre à jour, insérer des données du serveur ligné à mon serveur SQL. Le SP a pris des heures ou plus de 10 heures pour fonctionner avec une grande base de données Oracle. Par conséquent T-SQL avec le serveur ligné n'est pas bon pour moi.EXEC (requête) AT linkedServer avec Oracle DB
Récemment, j'ai trouvé OPENQUERY et EXEC (...) AT linedServer. OPENQUERY() est très rapide. Il a fallu environ 0 fois pour obtenir le même résultat. Cependant, il ne prend pas en charge les requêtes ou expressions variables. La requête doit être une chaîne constante littérale.
EXEC() est de la même manière qu'une requête directe vers Oracle. C'est rapide aussi. Par exemple:
EXEC ('SELECT COUNT(*) FROM owner.table1 WHERE id = ' + CAST(@id AS VARCHAR))
AT oracleServer
Le problème que j'ai est de savoir comment transmettre le résultat COUNT (*). J'ai essayé de google exemples dans le web et msdn. Tout ce que je peux trouver sont des exemples SQL ou ExpressSQL linedServer comme:
EXEC ('SELECT ? = COUNT(*) FROM ...', @myCount OUTPUT) AT expressSQL
Cette requête ne fonctionne pas pour Oracle. Il semble dans Oracle, vous pouvez définir la valeur en sortie de cette manière:
SELECT COUNT(*) INTO myCount ...
J'ai essayé ceci:
EXEC ('SELECT COUNT(*) INTO ? FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT COUNT(*) INTO : FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT : = COUNT(*) FROM ...', @myCount OUTPUT) AT oracleServer
Aucun de ceux qui travaillent. J'ai reçu un message d'erreur disant que la requête n'est pas exécutable sur le serveur Oracle.
Je pourrais écrire un projet .Net SQL Server pour faire le travail. Avant cela, je me demande simplement s'il y a moyen de faire passer la valeur comme paramètre oupput pour que je mette les meilleurs codes T-SQL de performance dans mon SP?
Récemment, je trouve une question intéressante avec cette méthode. J'ai posté des détails dans mon bog sur Using Exec() At Continued (http://davidchuprogramming.blogspot.com/2009/03/using-exec-at-continued.html). –