从存储过程插入不同的列

时间:2019-02-27 17:19:32

标签: 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 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

2 个答案:

答案 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。使用表格) )。

相关问题