这是两部分问题:
我有两个存储过程:sp1 和 sp2。如果 sp1 创建一个临时表 #temp 然后执行 sp2 我可以在嵌套过程中访问 #temp 吗?如果没有,如何以另一种方式做到这一点?
函数可以接受表类型的参数吗?我试过了,但 SQL Server 给了我一个错误。为什么这行不通?也许 sqlserver 应该支持类似 Generic 的东西。
这是两部分问题:
我有两个存储过程:sp1 和 sp2。如果 sp1 创建一个临时表 #temp 然后执行 sp2 我可以在嵌套过程中访问 #temp 吗?如果没有,如何以另一种方式做到这一点?
函数可以接受表类型的参数吗?我试过了,但 SQL Server 给了我一个错误。为什么这行不通?也许 sqlserver 应该支持类似 Generic 的东西。
是的,临时表在连接范围内,因此嵌套存储过程 (sp2) 将有权访问 sp1 中的 #temp table create。
是的,在 SQL 2008 中,我们能够将表值参数 (TVP) 作为输入传递给函数或存储过程。你可以在这里阅读更多。
它的工作原理,要访问子程序中的临时表,它必须在父程序中声明。
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
这个例子有效:
可以在嵌套过程中访问过程的临时表
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
当从父 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