SQL Sever 데이터베이스에서 흥미로운 동작이 나타납니다. 테이블 X를 선택하는 병합 문이 있습니다. 일치 절에 테이블 X에 대한 subselect가 있습니다. SQL Server 도구에서 저장 프로 시저를 실행하면 올바르게 작동합니다. 하지만 IPC (ETL Tool)에서 실행하면 예외가 발생합니다. Invalid object name 'X'.
동일한 저장 프로 시저에서 성공적으로 업데이트 된 테이블의 개체 이름이 잘못되었습니다.
지금까지 아무 것도 특별하지 않았으므로 사용 권한이 잘못되었을 수도 있습니다.
이상한 점 : 병합 문이 try 블록에 있고 catch 블록에서 오류 메시지가 update 문을 통해 테이블 X에 기록됩니다! SQL Server가 테이블 X를 찾을 수 없다는 불만이있을 때 어떻게 가능합니까?
또한 코드 생성을 통해 동일한 방식으로 생성되지만 다른 테이블 집합에서 생성되는 다른 저장 프로 시저와 모두 잘 동작합니다.
코드는 무슨 일이 일어나고 있는지이
merge ...
using
(select ...
from dbo.X
where ...
when not matched by target
and not exists (select 1 from dbo.X q2 where ...)
then insert (...
)
values (...
)
when matched and q.ACTION='D'
then delete
when matched AND NOT exists (select 1 from dbo.X q3 where ...)
then update
set
...
OUTPUT $action INTO @l_SummaryOfChanges;
-- Query the results of the table variable.
SELECT ACTION, COUNT(*) AS CountPerChange
FROM @l_SummaryOfChanges
GROUP BY ACTION;
end try
begin catch
update dbo.X
set LAST_ERROR_MSG=ERROR_MESSAGE(), ERROR_COUNTER=ERROR_COUNTER+1
where [email protected]_SyncID
end catch
어떤 아이디어처럼 보인다? 잘못된 개체 이름 '싱크 $의 _tabTeiledaten을'.
정확한 메시지를 보내주십시오. 그리고 X의 모든 용도는 dbo로 자격이 부여 된 스키마입니까? – gbn
오류 메시지가 우리가 보는 것과 정확히 일치하도록 업데이트했습니다. dbo 앞에 접두어가 붙은 코드의 모든 항목. 대문자 사용법은 모든 경우에 똑같습니다. 그러나 우리가 오류 메시지에서 보는 것과 다릅니다. (그것은 힌트일지도 모른다) –