无法将过程存储到动态临时表中

sto*_*ner 2 sql t-sql sql-server stored-procedures

我有一个返回列的存储过程.出于功能原因,该存储过程主要由其他查询使用

所以我的存储过程:

IF OBJECT_ID ( 'dbo.ProcDim', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.ProcDim;
GO
CREATE PROCEDURE dbo.ProcDim
                            @Dim1 nvarchar(50), 
                            @Dim2 nvarchar(50) 
AS 
    SET NOCOUNT ON;
    IF OBJECT_ID('tempdb..#TMP1') IS NOT NULL
    DROP TABLE #TMP1

    SELECT  
    INTO    #TMP1           
    FROM  DBase.dbo.Table1  AS Parameter
    WHERE Parameter.Dim1    = @Dim1 
    AND   Parameter.Dim2    = @Dim2;
GO

EXECUTE dbo.ProcDim N'value1', N'value2';
SELECT * from #TMP1
Run Code Online (Sandbox Code Playgroud)

所以当我执行我的程序没有#TMP1工作正常但我想将结果插入临时表

And*_*yev 6

您不能以这种方式使用临时表.

通过此代码:SELECT INTO #TMP1您隐藏创建临时表,并且可以在存储过程的范围内访问 - 但不在此范围之外.

如果需要在存储过程之外访问此临时表,则必须INTO #TMP1从存储过程中删除并在外部明确创建它:

create table #tmp1 (columns_definitions_here)

insert into #tmp1
exec  dbo.ProcDim N'value1', N'value2';

select * from #TMP1
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您必须显式创建临时表,提供所有列名及其数据类型.

或者,您可以将存储过程更改为用户定义的表函数,在这种情况下,您将能够隐式创建和填充临时表:

create function dbo.FuncDim
(
    @Dim1 nvarchar(50), 
    @Dim2 nvarchar(50)
)
returns @result TABLE (columns_definition_here) 
as
begin
    ... your code
   return
end

select  *
into  #TMP1
from dbo.FuncDim(@Dim1, @Dim2)
Run Code Online (Sandbox Code Playgroud)