Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从存储过程插入不同的列_Sql Server_Stored Procedures_Temp Tables - Fatal编程技术网

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