在存储过程中连续创建和删除临时表
Creating and deleting temp tables consecutively in a stored procedure
当我 运行 时这段代码不起作用,我不明白为什么它不应该,错误是 table 已经存在所以它看起来不是更像是一个实际的错误,而是验证过程中的错误,也许我错了。它来自一个过程,所以不能到处使用 go。
在我的第一个问题中,我严重简化了我的问题
这些是我的限制条件:
我使用临时 tables 在程序之间进行通信,在这种情况下我需要使用相同的程序两次但参数不同所以我需要 table "#a" 被告知两次。因为工作方式是在执行过程之前创建一个临时的 table,并且以这种形式,过程将知道它是否需要执行 select 或通知 table。如果它通知 table 它也负责创建列(这样做是为了避免过程之间的依赖关系)。所以我不能重复使用相同的 table 因为已经创建了列。
我找到的解决方案是创建另一个存储过程来完成第二部分的工作,我本可以更改该过程sp_a,但我无法实际控制它。
CREATE PROCEDURE zzzzz_testtodelete
AS
BEGIN
CREATE TABLE #a(idtmp bit)
Exec sp_a
@a = 1
.....
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
Exec sp_a
@a = 2
.....
DROP TABLE #a
END
这是正常现象还是 sql 的错误?
临时 tables 在存储过程中效率较低,请尝试使用 table 类型,您不需要删除它们。
DECLARE @a TABLE (idtmp bit)
这是正常的。这里发生的是编译错误,而不是 运行 时错误。这是因为在解析batch的时候,SQL服务器看到你已经创建了#a
,所以重新创建会报错。同样,此错误不是 运行 时错误,而是编译错误。测试:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
请注意 TESTING
未打印,因为由于编译错误甚至没有执行批处理。
在第一个 DROP
和第二个 CREATE
之间放置一个 GO
将解决问题:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
GO
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
这是因为您现在有两个单独的批次。 SQL 服务器按批次解析和验证 sql 个查询。
仅在 OP 编辑后 he/she 声明这是在存储过程中使用的。在那种情况下,没有真正的解决方案。不过,这是一个编译错误。代码未执行。
此外,根据BOL:
If more than one temporary table is created inside a single stored
procedure or batch, they must have different names.
解决方法是对 table 使用不同的名称。或者在第一次使用后直接 运行 分类 table。
试试这个方法
IF Object_id('tempdb..#temp') is not null
Drop table #temp
create table #temp (table columns as desired)
当我 运行 时这段代码不起作用,我不明白为什么它不应该,错误是 table 已经存在所以它看起来不是更像是一个实际的错误,而是验证过程中的错误,也许我错了。它来自一个过程,所以不能到处使用 go。
在我的第一个问题中,我严重简化了我的问题
这些是我的限制条件:
我使用临时 tables 在程序之间进行通信,在这种情况下我需要使用相同的程序两次但参数不同所以我需要 table "#a" 被告知两次。因为工作方式是在执行过程之前创建一个临时的 table,并且以这种形式,过程将知道它是否需要执行 select 或通知 table。如果它通知 table 它也负责创建列(这样做是为了避免过程之间的依赖关系)。所以我不能重复使用相同的 table 因为已经创建了列。
我找到的解决方案是创建另一个存储过程来完成第二部分的工作,我本可以更改该过程sp_a,但我无法实际控制它。
CREATE PROCEDURE zzzzz_testtodelete
AS
BEGIN
CREATE TABLE #a(idtmp bit)
Exec sp_a
@a = 1
.....
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
Exec sp_a
@a = 2
.....
DROP TABLE #a
END
这是正常现象还是 sql 的错误?
临时 tables 在存储过程中效率较低,请尝试使用 table 类型,您不需要删除它们。
DECLARE @a TABLE (idtmp bit)
这是正常的。这里发生的是编译错误,而不是 运行 时错误。这是因为在解析batch的时候,SQL服务器看到你已经创建了#a
,所以重新创建会报错。同样,此错误不是 运行 时错误,而是编译错误。测试:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
请注意 TESTING
未打印,因为由于编译错误甚至没有执行批处理。
在第一个 DROP
和第二个 CREATE
之间放置一个 GO
将解决问题:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
GO
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
这是因为您现在有两个单独的批次。 SQL 服务器按批次解析和验证 sql 个查询。
仅在 OP 编辑后 he/she 声明这是在存储过程中使用的。在那种情况下,没有真正的解决方案。不过,这是一个编译错误。代码未执行。
此外,根据BOL:
If more than one temporary table is created inside a single stored procedure or batch, they must have different names.
解决方法是对 table 使用不同的名称。或者在第一次使用后直接 运行 分类 table。
试试这个方法
IF Object_id('tempdb..#temp') is not null
Drop table #temp
create table #temp (table columns as desired)