嵌套存储过程调用时临时表的范围是多少?

时间:2012-06-20 04:28:21

标签: sql-server tsql stored-procedures

这是两部分问题:

  1. 我有两个存储过程:sp1& SP2。如果sp1创建临时表#temp然后执行sp2我将在嵌套过程中访问#temp吗?如果没有,怎么用另一种方式呢?

  2. 函数是否可以接受表类型的参数?我试过但是SQL Server给了我一个错误。为什么这不起作用?也许sqlserver应该支持像Generic这样的东西。

4 个答案:

答案 0 :(得分:6)

  1. 是的,临时表位于连接范围内,因此嵌套存储过程(sp2)可以访问sp1中的#temp table create。

  2. 是的,在SQL 2008中,我们能够将表值参数(TVP)作为输入传递给函数或存储过程。你可以read more here

答案 1 :(得分:6)

IT工作,要访问子程序中的临时表,必须在父程序中声明它。

create proc test2
    As
    BEGIN

        insert into #tmpchild
        select 100

    END

CREATE PROC [dbo].[TEST]
As
BEGIN

    create table #tmpchild(id int)
    exec test2;
    select * FROM #tmpchild;
END

这里当您运行TEST SP时它会调用test2,在子SP中可以访问#tempchild。 它给出了以下输出。

100

答案 2 :(得分:1)

此示例有效:

可以在嵌套过程中访问过程的临时表

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

答案 3 :(得分:1)

从父SP调用时,可以在子SP中访问Temparary表,因为临时表位于连接范围内。请参阅以下代码以供参考。

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