2017-09-18 1 views
1

Je stocke des données provenant de deux serveurs de données distincts sur un serveur de transfert - un serveur contient les informations de commande et le second serveur contient des informations d'expédition pour cet ordre. Je tire sur toutes les commandes modifiées au cours des 5 derniers jours. Je veux ensuite charger toutes les informations d'expédition associées à ces commandes modifiées. Il y a donc 3 serveurs dans ce scénario: le serveur de commande, le serveur d'expédition et le serveur de stockage intermédiaire.Données SSIS Stage à partir des valeurs d'une table locale

J'ai essayé de créer un conteneur pour chaque conteneur en fonction de la liste des commandes par étapes - mais avec un résultat défini dans les 1000, c'est une solution TRÈS lente.

Je ne peux pas modifier le serveur de commande ou d'expédition, mais je peux faire tout ce dont j'ai besoin sur le serveur de stockage.

Ce que je veux vraiment faire est de créer un objet variable avec une liste de numéros d'ordre, puis dans mon serveur de livraison instruction select a aa filtre comme ceci:

sélectionnez [champs d'expédition] de [shipping_table] où order_nbr dans [variable_list_of_order_nbrs]

+0

Quelle partie de la tâche est plus lente? Je veux dire si c'est un serveur de commande ou un serveur d'expédition ou un serveur de transit? – Rex

+0

en boucle à travers chacun des ~ 2000 commandes pour aller chercher les informations d'expédition une par une est lente. – tember

Répondre

1

Si vos informations d'expédition sont bien indexées, une transformation peut être très rapide lorsque vous sélectionnez "Pas de cache". Si vous avez besoin de retirer plus d'une ligne, cela peut être plus compliqué, mais il est possible avec une transformation Script asynchrone de créer des numéros de ligne d'espace réservé, puis une instruction SQL Lookup modifiée (avec un champ ROW_NUMBER()) pour vous assurer de retirer toutes les lignes requises et chaque ligne une seule fois.

+0

Comment puis-je utiliser une recherche pour récupérer des informations? Je l'ai seulement utilisé l'information de filtre. Je ne veux pas mettre en scène TOUTES les données d'expédition et ensuite les filtrer - je préférerais seulement mettre en scène les données d'expédition souhaitées. – tember

+0

En tant que correspondance de ligne 1-1 de base, vous devez utiliser la transformation de recherche pour rechercher une clé, par exemple, OrderID, ou ce que vous avez. Vous extrayez ensuite cette information de la table d'expédition. Vous ne traiterez que les commandes qui vous intéressent à l'aide de ce composant. Par conséquent, vous ne récupérerez que les informations d'expédition correspondantes. –

+0

désolé - je suis dense. Comment sélectionner 2000 lignes de la table d'expédition en fonction de ce que j'ai mis en scène pour les commandes. La façon dont je comprends la transformation Lookup ma requête source aurait besoin d'analyser la table entière et la transformation Lookup filtrerait ce qui est nécessaire. Correct? Je vais essayer quand même ... – tember

0

Je ne suis pas sûr de savoir comment efficace cette solution est, mais vient de sortir de mon esprit avec mes compétences SQL: Note: Cela nécessite changer pour servir et logique aller chercher serveur d'expédition

Fetch l'ensemble des données d'enregistrement à partir de la source (service de commande) en tant que données XML

DECLARE @Product Table (
ID INT) 

INSERT into @Product 
select top 10 ROW_NUMBER() over(order by a.name) as Rcount 
from sys.all_objects a --used here for demo to generate series of numbers 

--Return as XML 
SELECT T.ID 
FROM @Product T 
FOR XML path('') 

Ensuite, transmettez ces données XML en tant que paramètre d'entrée au serveur d'expédition. Récupère les enregistrements rejoignant la sortie du paramètre XML.

DECLARE @XMlVal XML 

set @XMLVal = (SELECT T.ID 
FROM @Product T 
FOR XML path('') 
) 

--Read from XML 
SELECT 
prod.value('(.)[1]', 'int') AS 'ID' 
FROM 
@XMLVal.nodes('/ID') AS temp(prod)