这是一个脚本,我认为它重现了与您的问题相同的问题:
CREATE PROCEDURE TestTmpTable
@value varchar(20)
AS
BEGIN
CREATE TABLE #test (id int IDENTITY, value varchar(20));
INSERT INTO #test (value) VALUES (@value)
SELECT * FROM #test;
DROP TABLE #test;
END
GO
CREATE TABLE #test (id int IDENTITY, value2 varchar(20));
EXEC TestTmpTable 'some text';
SELECT * FROM #test;
DROP TABLE #test;
GO
DROP PROCEDURE TestTmpTable
正如你所看到的,有两个#test
这里的表,一个是在存储过程中创建的,另一个是在调用存储过程的批处理中创建的。它们具有不同的结构:其中一个有一个名为value
,另一个名为value2
。如果运行该脚本,您将看到以下错误:
Msg 207, Level 16, State 1, Procedure TestTmpTable, Line 6
Invalid column name 'value'.
目前我无法向您指出相关文档文章,但对我来说,很明显,在执行 SP 之前立即进行了一些初步名称检查。在此阶段,存储过程中引用的列名称与实际存在的列名称之间存在差异已经存在的表被揭露,这使得执行变得不可能。
如果你改变value2
to value
,该脚本将毫无问题地运行,并且输出中将有两个行集,其中一个带有'some text'
值,其他为空。当然,如果您删除与外部相关的所有部分,该脚本将起作用#test
table.
因此,请检查调用您的程序的位置,看看是否还有其他地方#users
此时表可能已经存在,如果是,请根据您的情况修改问题。