首页 > 解决方案 > SQL Server 2016 中的间歇性不明确列错误

问题描述

我有一个复杂的存储过程,它还将调用其他存储过程作为工作流的一部分。我检查了所有存储过程中是否存在不明确的列 'ColumnId'错误。

第一个奇怪之处是错误是通过单个输入参数化的,即使使用相同的输入,错误也不会为所有用户重新创建。第二个奇怪的地方是,我检查了所有的 SELECT、JOIN、WHERE、ORDER BY 和 GROUP BY 是否存在歧义的正常错误,但没有发现任何违规行为。

唯一可能的违规行为可能是

SELECT      RateID
FROM        Rate.tblRate
INNER JOIN  #tmpRate
ON          tblRate.CustomerID = #tmpRate.CustomerID

ON 的行可能是一个问题,因为它不是

ON Rate.tblRate.CustomerID = #tmpRate.CustomerID

标签: sqlsql-serversql-server-2016

解决方案


在您的情况下,proc 可能会返回不同的或多个结果集,从而使这种行为变得零星。但是,我已经在临时表中看到了很多,尽管我无法解释原因。如果您为该表命名,它每次都会解析它。

SELECT      RateID
FROM        Rate.tblRate r
INNER JOIN  #tmpRate t
ON          r.CustomerID = t.CustomerID

这是一种很好的做法,因为它是其他实例所必需的,例如表变量。如果 object_id('tempdb..#temp') 不为空 drop table #temp

select 1 as ID into #temp

declare @table table (ID int)
insert into @table
values
(1)

select * 
from
@table 
inner join #temp on #temp.ID = @table.ID

这将引发错误:

必须声明标量变量“@table”。

所以,给它取别名,它会起作用:

select * 
from
@table t
inner join #temp on #temp.ID = t.ID

有很多关于为什么养成一个好习惯的博客。这是一个。


推荐阅读