9
votes

Quelle est la portée de la table Temp quand elle est appelée par procédure stockée imbriquée?

Ceci est deux parties question:

  1. 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?

  2. 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.


0 commentaires

4 Réponses :


13
votes
  1. 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.

  2. 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 .


0 commentaires

1
votes

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


0 commentaires

12
votes

Cela fonctionne, pour accéder à la table TEMP dans les procédures de l'enfant, il doit être déclaré au parent.

100


2 commentaires

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 :)



1
votes

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


2 commentaires

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.