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工作正常但我想将结果插入临时表
您不能以这种方式使用临时表.
通过此代码: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)