如何将其插入已在存储过程内部创建的临时表中
ALTER PROCEDURE [dbo].[Report_1]
BEGIN
CREATE TABLE #Temp
(
col1 INT,
col2 INT,
col3 VARCHAR(50)
)
INSERT INTO #Temp
EXEC [spSelection] @ID
..do stuff
..do stuff
..do stuff
SELECT * FROM #temp
END
我遇到的问题是,将来我将使用此存储过程(spSelection
),如果更改此存储过程以获取更多列用于其他存储过程,则Report_1
将失败。
所以我需要一种动态创建表的方法,或者只能从exec [spSelection] @ID
的输出中选择不同的列,或者让Report_1
可以从在{{1 }}。
我尝试使用全局,但无法使用,因为如果创建动态SQL,它可以同时被其他存储过程使用。
spSelection
我无法在引号之外访问@sql ='
create table #Temp(
col1 int,col2 int,col3 varchar(50)
) ' exec sp_executesql @sql
表
答案 0 :(得分:0)
您可以创建视图并使用SELECT INTO
子句在运行时动态创建临时表,而不是创建用于选择结果的存储过程。
您不能在select语句中使用存储过程。
答案 1 :(得分:0)
一种选择是更改您的SP,以在SP中插入 :
ALTER PROCEDURE [spSelection]
AS
BEGIN
-- Validate that your temporary table was created (the insert will fail otherwise)
IF OBJECT_ID('tempdb..#Temp') IS NULL
BEGIN
RAISERROR ('The table #Temp must be created before executing this SP', 16, 1)
RETURN
END
..do stuff
..do stuff
..do stuff
INSERT INTO #Temp (
col1,
col2,
col3)
SELECT
/*Columns*/
END
GO
ALTER PROCEDURE [dbo].[Report_1]
BEGIN
CREATE TABLE #Temp
(
col1 INT,
col2 INT,
col3 VARCHAR(50)
)
EXEC [spSelection] @ID -- Will insert into #Temp
..do stuff
..do stuff
..do stuff
SELECT * FROM #temp
END
如果最终将新列添加到#Temp
表并将它们插入到SP中而不在每个调用它的SP中更新CREATE TABLE
,则此方法将失败。
这里没有确定的解决方案,请阅读this excellent paper,了解关于在SP之间共享数据的所有可能方法,各有其优缺点(我在此处发布的解决方案列为 4。使用表格) )。