sql - 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
解决方案
在您的情况下,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
有很多关于为什么养成一个好习惯的博客。这是一个。
推荐阅读
- java - 无论请求中指定的字符集如何,都需要以通用模式存储字节
- vb.net - 在starting.exe 中发生了“System.NotImplementedException”类型的未处理异常
- c++ - 使用全局运算符向作用域枚举添加特定的隐式转换,特别是对于按位标志 - 坏主意?
- javascript - 仅当元素填充文本时才显示元素,空规则不起作用
- python - 检查排列python上排列出现的行号
- r - 用 gganimate 绘制地图,区域填充被打乱
- java - 如何解决 android.view.InflateException: Error inflating class android.support.design.widget.TextInputLayout?
- android - 删除回收站视图元素之间的间距
- ruby-on-rails - 如何在 where 语句中使用 Rails“gt”或“lt”?
- excel - 复制行,将新工作表粘贴为包含数据的最后一行,然后从源工作表中删除行