SQL Server 2016中的间歇性歧义列错误

时间:2018-07-05 13:00:45

标签: sql sql-server 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 Rate.tblRate.CustomerID = #tmpRate.CustomerID

1 个答案:

答案 0 :(得分:1)

在您的情况下,该proc可能返回不同的结果,或者返回多个结果集,从而使此行为为零星的。但是,尽管我无法解释原因,但我已经在临时表中看到了很多。如果为该表创建别名,则每次都会对其进行解析。

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

这是一个好习惯,因为对于其他实例(例如表变量)是必需的。 如果object_id('tempdb ..#temp')不为空,则删除表#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

关于如何养成良好习惯的博客很多。 Here is one.