Sql server 从存储过程插入不同的列
如何插入到存储过程内部已准备好创建的临时表中Sql server 从存储过程插入不同的列,sql-server,stored-procedures,temp-tables,Sql Server,Stored Procedures,Temp Tables,如何插入到存储过程内部已准备好创建的临时表中 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
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
我遇到的问题是,我将来将使用此存储过程,如果我更改此存储过程以获得不同存储过程的更多列,则Report_1将失败
因此,我需要一种方法来动态创建表,或者只能从exec[spSelection]@ID的输出中选择不同的列,或者让Report_1能够从spSelection中创建的临时表中读取
我曾尝试使用一个全局变量,但这不起作用,因为如果我创建一个动态SQL,其他存储过程可以同时使用它
@sql ='
create table #Temp(
col1 int,col2 int,col3 varchar(50)
) ' exec sp_executesql @sql
我无法访问引号之外的临时表,您可以创建视图并使用SELECT INTO子句在运行时动态创建临时表,而不是创建用于选择结果的存储过程
您不能在select语句中使用存储过程。一种替代方法是更改SP以在SP内插入: 如果最终向临时表中添加新列并将其插入SP中,而不更新每个调用临时表的SP中的CREATE表,则此方法将失败
这里没有确定的解决方案,请阅读SP之间共享数据的所有可能方法,以及每种方法的优缺点。我在这里发布的解决方案列为4。使用表。这是一个存储过程,就像存储在SQL Server中的过程一样,不是存储过程……然后创建一个新的存储过程。只要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