这段代码在我运行时并不起作用,而且我不明白为什么它不应该,错误是表格已经存在所以它看起来并不像一个实际的错误,但验证过程中的错误,也许我错了。它来自一个程序,所以无处可去使用go。
在我的第一个问题中,我严重过度简化了我的问题
这些是我的约束:
我使用临时表来在程序之间进行通信,在这种情况下,我需要使用相同的程序两次,但使用不同的参数,所以我需要表格#34;#a"被告知两次。因为工作方式是在执行过程之前创建临时表,并且在该形式中,过程将知道是否需要执行select或通知表。如果它通知表,它也负责创建列(这样做是为了避免程序之间的依赖关系)。所以我不能重复使用同一个表,因为列已经创建了。
我找到的解决方案是创建另一个存储过程,它将完成第二部分的工作,我本可以更改过程sp_a但我不能实际控制它。
SQL > SELECT name FROM V$DATAFILE;
SQL > SELECT * FROM V$LOGFILE;
这是正常的还是来自sql的错误?
答案 0 :(得分:2)
这很正常。这里发生的是编译错误,而不是运行时错误。这是因为在解析批处理时,SQL Server发现您已经创建了#a
,因此再次创建它将产生错误。同样,此错误不是运行时错误,而是编译错误。测试:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
请注意,由于编译错误,甚至没有执行批处理,因此不打印TESTING
。
在GO
和第二DROP
之间放置一个CREATE
将解决问题:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
GO
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
这是因为您现在有两个单独的批次。 SQL Server按批处理解析和验证sql查询。
只有在OP编辑之后,他/她才声明这是在存储过程中使用的。在那种情况下,没有真正的解决方案。不过,这是一个编译错误。代码未执行。
此外,根据BOL:
如果在单个存储中创建了多个临时表 程序或批次,它们必须有不同的名称。
解决方法是为表使用不同的名称。或者只是在第一次使用后截断表格。
答案 1 :(得分:0)
临时表在存储过程中效率较低,尝试使用表类型,您不需要删除它们。
DECLARE @a TABLE (idtmp bit)
答案 2 :(得分:0)
试试这种方式
IF Object_id('tempdb..#temp') is not null
Drop table #temp
create table #temp (table columns as desired)