我有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;
谢谢大家的回答…我最终得到了以下解决方案:
通过调用存储过程的脚本,我创建了#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行,整个过程运行得非常快!