Ceci est deux parties question: p>
J'ai deux procédures stockées: SP1 & SP2. Si SP1 crée une table Temp #temp, alors exécute SP2 aurai-je accès à #Temp dans la procédure imbriquée? Sinon, comment le faire d'une autre manière? P> LI>
Une fonction peut accepter un paramètre de table de type? J'ai essayé mais SQL Server me donne une erreur. Pourquoi cela ne peut pas fonctionner? Peut-être que SQLServer devrait supporter quelque chose comme générique. P> LI> ol>
4 Réponses :
Oui, la table Temp est dans le cadre de la connexion. La procédure stockée imbriquée (SP2) aura accès à #Temp Créer dans SP1. P> LI>
Oui, dans SQL 2008, nous avons la possibilité de passer un paramètre valorisé de la table (TVP) comme entrée sur une fonction ou une procédure stockée. Vous pouvez En savoir plus ici . P> LI> ol>
Cet exemple fonctionne:
Table Table d'une procédure est accessible dans la procédure imbriquée P>
alter procedure tests2 (@tmptbl varchar(20)) as declare @sql as nvarchar(1000) set @sql = 'select * from ' + @tmptbl exec sp_executesql @sql print @tmptbl go alter procedure tests1 as IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE ID = OBJECT_ID(N'tempdb..#tmpchild')) BEGIN DROP TABLE #tmpchild END create table #tmpchild(id int) insert into #tmpchild(id) values(100) exec tests2 '#tmpchild' go exec tests1
Cela fonctionne, pour accéder à la table TEMP dans les procédures de l'enfant, il doit être déclaré au parent.
100
Solution brillante. J'étais sceptique au début, mais cela m'a fini par sauver beaucoup de problèmes - j'aimerais pouvoir upérer +10.
@SqlServersteve Vous pouvez maintenant, si vous n'avez pas :)
Tableau TEMPARARAIRE est accessible dans l'enfant SP lorsqu'il est appelé de parent sp sous forme de table Temp dans la portée de la connexion. Veuillez consulter ci-dessous le code pour référence.
CREATE PROCEDURE ParentSP AS BEGIN --Assuming, there is a pre-existing 'Employee' table in DB select * INTO #TempTable FROM Employee --temparary table created here EXEC ChildSP END GO CREATE PROCEDURE ChildSP AS BEGIN (select COUNT(1) as Count FROM #Temp) select * FROM #TempTable --tempary table assessed here END GO EXEC ParentSP
J'apprécie votre exemple mais où est la table des employés, pouvez-vous l'ajouter également
@programTreesures: J'ai ajouté un commentaire qui «supposer qu'il y a une table d'employé dans la DB. Veuillez créer un et vous n'aurez pas de problème dans la solution.