如何解决第一次执行GO后,存储过程中的临时表不可用
谢谢大家的回答…我最终得到了以下解决方案:
通过调用存储过程的脚本,我创建了#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行,整个过程运行得非常快!
解决方法
我有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,NewID int);
--These inserts are essentially repeated 70,@PassInVariable);
INSERT INTO #TempTable(NewID) SELECT SCOPE_IDENTITY();
GO
INSERT INTO MyDBTable (something,something) (1,@PassInVariable);
INSERT INTO #TempTable(NewID) SELECT SCOPE_IDENTITY();
SELECT * FROM #TempTable;
DROP TABLE #TempTable;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。