小编典典

第一次执行GO后,存储过程中的临时表不可用

sql

我有140,000条需要运行的INSERT语句。我试图将记录的插入数据库表中,然后将创建的PK输入到临时表中,然后我将其返回。看起来像这样:

CREATE PROCEDURE sp_MassInsertProcedure
    @PassInVariable int
AS
    CREATE TABLE #TempTable(OriginalID int IDENTITY(1,1), NewID int);

    --These two inserts are essentially repeated 70,000 times
    INSERT INTO MyDBTable (something, something, something) VALUES (1, 2, @PassInVariable);
    INSERT INTO #TempTable(NewID) SELECT SCOPE_IDENTITY();

    SELECT * FROM #TempTable;
    DROP TABLE #TempTable;

我也有一些其他存储过程,它们最多具有2,000个insert语句,并且这种方式可以很好地工作,但是我认为由于该特定SP中的语句数量众多,当我尝试创建存储过程时,它给了我“查询完成但有错误”的信息。程序,但实际上并未创建该程序。

然后,我每200条insert语句添加一个GO,但是在第一个GO执行之后,必须释放临时表,并且出现“ TempTable不可用”错误(在第一个GO执行后,@
PassInVariable也得到相同的错误)。奇怪的是,当我将上述解释的SQL放在标准脚本(而不是存储过程)中时,它可以工作。

所以我的问题是,有人知道如何在通过GO命令使用多个批处理执行的单个存储过程中持久保存临时表/变量吗?

CREATE PROCEDURE sp_MassInsertProcedure
    @PassInVariable int
AS
    CREATE TABLE #TempTable(OriginalID int IDENTITY(1,1), NewID int);

    --These inserts are essentially repeated 70,000 times
    INSERT INTO MyDBTable (something, something, something) VALUES (1, 2, @PassInVariable);
    INSERT INTO #TempTable(NewID) SELECT SCOPE_IDENTITY();
    GO
    INSERT INTO MyDBTable (something, something, something) (1, 2, @PassInVariable);
    INSERT INTO #TempTable(NewID) SELECT SCOPE_IDENTITY();

    SELECT * FROM #TempTable;
    DROP TABLE #TempTable;

阅读 225

收藏
2021-04-22

共1个答案

小编典典

谢谢大家的回答…我最终得到了以下解决方案:

通过调用存储过程的脚本,我创建了#TempTable

CREATE TABLE #TempTable (OriginalID int IDENTITY(1,1), NewID int);
EXEC sp_InsertMassRecords 777;

然后在我的存储过程中,我有:

CREATE PROCEDURE sp_InsertMassRecords
    @IncomingVariable int
AS
BEGIN
    SET NOCOUNT ON;

    INSERT MyDBTable (col1, col2, col3) 
    OUTPUT Inserted.ID INTO #TempTable(NewID)
    SELECT 1, @IncomingVariable, 3 UNION ALL
    SELECT 4, @IncomingVariable, 6 UNION ALL...

在大约每100条select语句之后,我重复了INSERT / OUTPUT行,整个过程运行得非常快!

2021-04-22