C# ';无效的列名';在SQL临时表中
我在使用临时表和一些SQL存储过程时遇到了一个非常奇怪的错误。在过去的几天里,我能得到的唯一错误是“超时已过期。在操作完成之前超时时间已过,或者服务器没有响应。”在将超时阈值提高到C#(从30秒提高到120秒)后,我现在得到了以下错误:C# ';无效的列名';在SQL临时表中,c#,sql-server,tsql,stored-procedures,temp-tables,C#,Sql Server,Tsql,Stored Procedures,Temp Tables,我在使用临时表和一些SQL存储过程时遇到了一个非常奇怪的错误。在过去的几天里,我能得到的唯一错误是“超时已过期。在操作完成之前超时时间已过,或者服务器没有响应。”在将超时阈值提高到C#(从30秒提高到120秒)后,我现在得到了以下错误: “无效的列名'CoverageLimit'。 列名“差异\选项”无效。 无效的列名“CoverageLimit”。 无效的列名“CoverageLimit”。 无效的列名“CoverageLimit”。 无效的列名“CoverageLimit”。 无效的列名“C
“无效的列名'CoverageLimit'。
列名“差异\选项”无效。
无效的列名“CoverageLimit”。
无效的列名“CoverageLimit”。
无效的列名“CoverageLimit”。
无效的列名“CoverageLimit”。
无效的列名“CoverageLimit”。
无效的列名“CoverageLimit”。
列名“差异\选项”无效。
列名“差异\选项”无效。
列名“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\u Options
的任何实例,并最终在两个完全不同的存储过程中找到了这个临时表:
CREATE TABLE [dbo].[#TEMP]
(
OptionID [int] IDENTITY(1,1) NOT NULL,
CoverageLimit int,
Difference_Options int
) ON [PRIMARY]
(注意:我不是设置此数据库架构的人。它非常需要清理/更新。)
现在,会不会有某种范围的问题?最奇怪的是,我们有相同的应用程序运行在不同的服务器上,使用相同的数据库,并且没有遇到这个错误
谢谢 如果您只为临时表使用有意义的名称,那么整个混乱本来可以避免,也应该避免。我的猜测是,由于某种原因,您的服务器无法删除其中一个临时表,这就是导致您出错的原因。如果您只为临时表使用有意义的名称,那么整个混乱本来可以避免,也应该避免。我的猜测是,由于某种原因,您的服务器无法删除其中一个临时表,这就是导致您出错的原因。如果您只为临时表使用有意义的名称,那么整个混乱本来可以避免,也应该避免。我的猜测是,由于某种原因,您的服务器无法删除其中一个临时表,这就是导致您出错的原因。如果您只为临时表使用有意义的名称,那么整个混乱本来可以避免,也应该避免。我的猜测是,由于某种原因,您的服务器无法删除其中一个临时表,这就是导致您出错的原因。它们是否可能位于您正在处理的常规表上?也许是通过使用触发器?您可能希望首先将临时表命名为temp以外的名称。使用有意义的对象名称。@Dave.Gugg我首先搜索了所有表以查看这些列是否存在,并且只在两个存储过程中找到它们。如果同一用户同时运行两个进程,Proc2将尝试使用Proc1中的#Temp表。它们是否位于您正在处理的常规表上?也许是通过使用触发器?您可能希望首先将临时表命名为temp以外的名称。使用有意义的对象名称。@Dave.Gugg我首先搜索了所有表以查看这些列是否存在,并且只在两个存储过程中找到它们。如果同一用户同时运行两个进程,Proc2将尝试使用Proc1中的#Temp表。它们是否位于您正在处理的常规表上?也许是通过使用触发器?您可能希望首先将临时表命名为temp以外的名称。使用有意义的对象名称。@Dave.Gugg我首先搜索了所有表以查看这些列是否存在,并且只在两个存储过程中找到它们。如果同一用户同时运行两个进程,Proc2将尝试使用Proc1中的#Temp表。它们是否位于您正在处理的常规表上?也许是通过使用触发器?您可能希望首先将临时表命名为temp以外的名称。使用有意义的对象名。@Dave.Gugg我首先搜索了所有表以查看这些列是否存在,并且只在两个存储过程中找到了它们。如果同一用户同时运行两个进程,Proc2将尝试使用Proc1中的#Temp表。建议尽可能使用表变量而不是Temp表是错误的。它们有不同的用途,正确使用时每个都很有用。@Dave.Gugg公平地说,
表值参数
表变量
。这是真的,但据我的理解,表值参数
得到了与表变量相同的坏基数估计,所以我仍然认为这不是一个好的建议。谢谢,我明白了。我本想在我的答案中添加这个链接,但使用手机会把粘贴弄得一团糟。对于OP@Dave.Gugg,您可以使用TF 2453()改进估算问题。无论如何,我认为建议将行传入,而不是创建一个#temp表并将其填充到过程中,这在许多情况下都会更好。根据估计,OP似乎没有性能问题-我们甚至不知道#temp表是否有多行。很多关于#temp
与@table
的谬论。建议尽可能使用表变量而不是temp表是不好的建议。它们有不同的用途,正确使用时每个都很有用。@Dave.Gugg公平地说,表值参数
表变量
。这是真的,但据我的理解,表值参数
得到了与表变量相同的坏基数估计,所以我仍然认为这不是一个好的建议。谢谢,我明白了。我本想在我的答案中添加这个链接,但使用手机会把粘贴弄得一团糟。大卫,到行动组去