Je viens de tester cela dans SQL Server 2008 R2
J'ai commencé par :
CREATE PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:10'
SELECT TOP 5 * FROM dbo.UniqueId
GO
J'ai ensuite fait ce qui suitSQL Server Query Window 1 :
EXEC dbo.Stupid
Fenêtre de requête SQL Server 2, alors que la requête de la fenêtre de requête 1 était en cours d'exécution :
ALTER PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:05'
SELECT TOP 5 * FROM dbo.UniqueId
WHERE ID > 5
GO
EXEC dbo.Stupid
Fenêtre de requête SQL Server 3, alors que les requêtes des fenêtres de requête 1 et 2 étaient en cours d'exécution :
EXEC dbo.Stupid
Résultats :
- La fenêtre de requête 1 s'est exécutée en 10 secondes (et s'est donc terminée après les fenêtres 2 et 3) et a renvoyé les identifiants 1 à 5
- La fenêtre de requête 2 a modifié et exécuté la procédure en 5 secondes, et a renvoyé les identifiants 6 à 10
- La fenêtre de requête 3 s'est exécutée en 5 secondes et a renvoyé les identifiants 6 à 10
Que se passe-t-il :
- Le code déjà en cours d'exécution terminera l'exécution de la procédure telle qu'elle était lors de son démarrage
- Tout ce qui commence à s'exécuter après la modification du code exécutera le nouveau code