【问题标题】:'Invalid column name' in SQL temp tableSQL 临时表中的“无效列名”
【发布时间】: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]

对此我感到很困惑,所以我执行了一个查询以在存储过程中查找CoverageLimitDifference_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


【解决方案1】:

如果您只为临时表使用有意义的名称,则本可以并且应该避免这种混乱。我的猜测是,由于某种原因,您的服务器无法删除其中一个临时表,这就是导致您的错误的原因。

【讨论】:

  • 建议尽可能使用表变量而不是临时表,这是一个不好的建议。它们用于不同的目的,并且在正确使用时都会有所帮助。
  • @Dave.Gugg 公平地说,table-valued parameters table variables
  • 是的,但据我了解table-valued parameters 得到与表变量相同的坏基数估计,所以我仍然认为这仍然不是一个好建议。
  • 谢谢,点了。我会将此链接添加到我的答案中,但使用手机会使粘贴变得一团糟。致 OP,Read this.
  • @Dave.Gugg 您可以使用 TF 2453 (I blogged about it here) 改进估计问题。无论如何,我认为建议是传递行而不是创建#temp 表并将其填充到过程中,这在许多情况下会更好。根据估计,OP 似乎没有性能问题——我们甚至不知道 #temp 表是否有不止一行。很多关于 #temp@table can be dispelled here 的神话。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2010-11-18
  • 2014-08-23
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多