这是两部分问题:
我有两个存储过程:sp1& SP2。如果sp1创建临时表#temp然后执行sp2我将在嵌套过程中访问#temp吗?如果没有,怎么用另一种方式呢?
函数是否可以接受表类型的参数?我试过但是SQL Server给了我一个错误。为什么这不起作用?也许sqlserver应该支持像Generic这样的东西。
答案 0 :(得分:6)
是的,临时表位于连接范围内,因此嵌套存储过程(sp2)可以访问sp1中的#temp table create。
是的,在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