【发布时间】:2015-05-13 17:48:22
【问题描述】:
我在使用临时表和一些 SQL 存储过程时遇到了一个非常奇怪的错误。在过去的几天里,我能得到的唯一错误是"Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding." 在提高 C# 中的超时阈值(从 30 秒到 120 秒)之后,我现在得到了这个错误:
"Invalid column name 'CoverageLimit'.
Invalid column name 'Difference_Options'.
Invalid column name 'CoverageLimit'.
Invalid column name 'CoverageLimit'.
Invalid column name 'CoverageLimit'.
Invalid column name 'CoverageLimit'.
Invalid column name 'CoverageLimit'.
Invalid column name 'CoverageLimit'.
Invalid column name 'Difference_Options'.
Invalid column name 'Difference_Options'.
Invalid column name 'CoverageLimit'."
但是,这些列在堆栈跟踪正在命中的函数中调用的存储过程中引用的临时表中不存在。
CREATE TABLE [dbo].[#TEMP]
(
FormEndorsementID [int] NOT NULL,
[Restriction] bit,
[Description] nvarchar(3000),
[Type] nvarchar(255),
[QQ_Reference] nvarchar(255),
[Values] nvarchar(255)
) ON [PRIMARY]
对此我感到很困惑,所以我执行了一个查询以在存储过程中查找CoverageLimit 或Difference_Options 的任何实例,并最终在两个完全不同的存储过程中找到了这个临时表:
CREATE TABLE [dbo].[#TEMP]
(
OptionID [int] IDENTITY(1,1) NOT NULL,
CoverageLimit int,
Difference_Options int
) ON [PRIMARY]
(注意:我不是设置此数据库架构的人。它急需清理/更新。)
现在,是否存在某种范围的问题?最奇怪的是,我们在具有相同数据库的不同服务器上运行相同的应用程序,但它没有遇到此错误。
谢谢!
【问题讨论】:
-
他们有没有可能出现在您正在处理的普通桌子上?也许通过使用触发器?
-
您可能希望首先将临时表命名为 TEMP 以外的名称。使用有意义的对象名称。
-
@Dave.Gugg 我首先搜索了所有的表,看看那些列是否存在,只在两个存储过程中找到了。
-
如果同一用户同时运行两个 proc,Proc2 将尝试使用 Proc1 中的#Temp 表。
标签: c# sql-server tsql stored-procedures temp-tables