我有一个复杂的存储过程,该存储过程还将在工作流中调用其他存储过程。我已经检查了所有存储过程中的模糊列'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
答案 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.