9

这是两部分问题:

  1. 我有两个存储过程:sp1 和 sp2。如果 sp1 创建一个临时表 #temp 然后执行 sp2 我可以在嵌套过程中访问 #temp 吗?如果没有,如何以另一种方式做到这一点?

  2. 函数可以接受表类型的参数吗?我试过了,但 SQL Server 给了我一个错误。为什么这行不通?也许 sqlserver 应该支持类似 Generic 的东西。

4

4 回答 4

13
  1. 是的,临时表在连接范围内,因此嵌套存储过程 (sp2) 将有权访问 sp1 中的 #temp table create。

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

于 2012-06-20T05:07:14.443 回答
12

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

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
于 2016-05-10T15:25:44.327 回答
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
于 2013-12-30T13:26:49.647 回答
1

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

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
于 2018-02-08T12:17:19.393 回答