Serveur SQL (TSQL) - Est-il possible d'instructions EXEC en parallèle?
SQL Server 2008 R2
Voici un exemple simplifié:
EXECUTE sp_executesql N'PRINT ''1st '' + convert(varchar, getdate(), 126) WAITFOR DELAY ''000:00:10'''
EXECUTE sp_executesql N'PRINT ''2nd '' + convert(varchar, getdate(), 126)'
La première instruction d'impression de la date et de retard de 10 secondes avant de poursuivre.
La deuxième déclaration doit imprimer immédiatement.
La façon de T-SQL fonctionne, la 2e déclaration ne sera pas évalué jusqu'à ce que la première est terminée. Si je l'ai copier et de le coller dans une nouvelle fenêtre de requête, il va exécuter immédiatement.
Le problème est que j'ai d'autres choses complexes, avec des variables qui doivent être transmis aux deux procédures.
Ce que je suis en train de faire est:
- Obtenir un record
- De verrouillage pour une période de temps
- lorsqu'il est verrouillé, exécuter certaines autres déclarations à l'encontre de cet enregistrement et la table elle-même
Peut-être il ya un moyen de créer dynamiquement un couple d'emplois?
De toute façon, je suis à la recherche d'un moyen simple de le faire sans avoir à les IMPRIMER manuellement des déclarations et des copier/coller à une autre session.
Est-il un moyen de EXEC sans attendre /en parallèle?
OriginalL'auteur Outside the Box Developer | 2010-12-31
Vous devez vous connecter pour publier un commentaire.
Oui, il y a un moyen, voir Asynchrone de l'exécution de la procédure.
Cependant, les chances sont que ce n'est pas ce dont vous avez besoin. T-SQL est un d'accès aux données de la langue, et quand vous prenez en compte les transactions, le verrouillage et le commit/rollback sémantique est presque impossible d'avoir une tâche parallèle. Parallèlement T-SQL fonctionne par exemple avec les demandes de files d'attente, où chaque demande est indépendante et il n'y a pas de corrélation entre les emplois.
Ce que vous décrivez ne sonne pas du tout comme quelque chose qui peut, ni ne doit, être paralellized.
La raison en parallèle", c'est à des fins de test. Parfois, l'origine d'une défaillance est exactement ce que vous voulez atteindre.
Vous pouvez exécuter un autre script à partir de la première script, soit via
sp_executesql
pour le côté serveur de l'exécution ou de l'utilisation de la:!
sqlcmd extension (SSMS appuie trop lorsqu'il est activé) pour le côté client de l'exécution. Une seule commande, vous pouvez exécuter eststart
, qui va lancer un processus et non pas attendre la fin. De sorte que vous pouvez exécutersp_executesql 'start sqlcmd -E -S. -d dbname -i "myscript.sql"';
et de parvenir à un "deuxième thread". Exactement comme s'exécuter à partir d'un autre SSMS fenêtre de requête, mais automatisés. Une chose que vous perdrez toute erreur/le résultat du script de commencer.OriginalL'auteur Remus Rusanu
Si vous souhaitez verrouiller un enregistrement de sorte que vous pouvez exécuter des instructions, vous pourriez voulez exécuter ces déclarations comme une transaction.
Pour exécuter SQL en parallèle, vous devez paralellize appels SQL, par l'exécution de votre SQL dans les différents threads/processus en Java, C++, perl, ou tout autre langage de programmation (l'enfer, le lancement de "isql" en shell script en arrière plan de travail)
OriginalL'auteur DVK
Si après la lecture de tous les ci-dessus sur les problèmes potentiels et vous voulez continuer à tourner les choses en parallèle, vous pouvez probablement essayer sql emplois, de mettre vos requêtes dans les différents emplois, puis exécuter en appelant les emplois comme ce
OriginalL'auteur robotj
Il pourrait être utile de lire l'article Asynchrone T-SQL Exécution Sans Service Broker.
OriginalL'auteur TJ Galama
Travaux de l'Agent SQL peuvent s'exécuter en parallèle et être créé directement à partir de TSQL. Le réponse par Remus Rusanu contient un lien qui en parle avec quelques inconvénients.
Un autre inconvénient est que l'augmentation des autorisations de sécurité nécessaires à la création de l'emploi. Aussi, pour la mise en œuvre ci-dessous, le travail doit être exécuté en tant qu'utilisateur spécifique+connexion avec le travail supplémentaire de gestion de privilèges.
Il est possible d'exécuter des requêtes SQL comme un autre (safer) de l'utilisateur, mais je crois qu'il exige sysadmin privilège de désigner le travail en tant que tel.
Le retour de @pJobIdHexOut peut être utilisé pour arrêter le travail si nécessaire.
OriginalL'auteur crokusek