4

원격 2000 서버에 대해 쿼리를 실행하려고합니다. 당신이 원격 서버를 추적 할 때열 접두사 '% s'이 (가) 쿼리에 사용 된 테이블 이름 또는 별칭 이름과 일치하지 않습니다.

The column prefix 'Tbl1002' does not match with a table name or alias name used in the query.

, 당신은 sp_cursorprepexec 배치이라고 볼 수 있지만, 지역 서버가 생성이 잘못된, 그리고 원격 서버의 원인이되는 쿼리는 오류를 반환합니다 , 사실, 잘못된 SQL; 존재하지 않는 테이블이 Tbl1002 인 참조가 있습니다.

난 내 로컬 서버에서 실행하고 쿼리는 다음과 같습니다 EmployeesPositions는 단순히 연결된 서버에서 선택되어 도면이다

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(*) 
     FROM Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM Positions P 
WHERE P.PositionID = '{D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7}' 

. 그 혼란을 제거하기 위해, 우리의 의견을 제거합니다 - 직접 명명 네 부분을 사용 :

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(*) 
     FROM WCLHR.CasinoHR.dbo.Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM WCLHR.CasinoHR.dbo.Positions P 
WHERE P.PositionID = '{D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7}' 

그리고 쿼리는 여전히 실패 : GUID를 주위에 혼란을 제거하기 위해

The column prefix 'Tbl1002' does not match with a table name or alias name used in the query.

WHERE 절에, 우리는 WHERE 절 제거 할 수 있습니다 :

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(*) 
     FROM WCLHR.CasinoHR.dbo.Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM WCLHR.CasinoHR.dbo.Positions P 

을 그리고 그것은 여전히 ​​실패 :

The column prefix 'Tbl1002' does not match with a table name or alias name used in the query.

COUNT*의 사용 주위에 혼란을 eliminte하기 위해, 우리는 그것을 제거하고 대신 만 일정하게 계산됩니다에서

:

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(1) 
     FROM WCLHR.CasinoHR.dbo.Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM WCLHR.CasinoHR.dbo.Positions P 

을 그리고 그것은 여전히 ​​실패 :

The column prefix 'Tbl1002' does not match with a table name or alias name used in the query.

아래로 내려 가서 연결된 서버를 제거하고 2000 컴퓨터에서 쿼리를 로컬로 실행합니다.

원격 서버 자체에서 실행하면 어떻게됩니까? 내가 원격 서버 자체에 대해이 쿼리를 실행하면

는 :

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(*) 
     FROM Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM Positions P 

그것은 잘 작동합니다.

생성 된 쿼리 란 무엇입니까? 어떻게 잘못 되었습니까?

프로필러를 사용하면 원격 서버로 들어오는 쿼리를 볼 수 있습니다. 그것은 엄청난 끔찍한 엉망이지만, 그것은 확실히 잘못되었습니다. 범위에없는 파생 테이블을 참조하려고합니다. 전체 배치는 SQL 서버에서 원격 서버로 작업을 끝낼 사람에게 익숙 할 것이다 :

declare @P1 int 
set @P1=NULL 
declare @P2 int 
set @P2=NULL 
declare @P3 int 
set @P3=557064 
declare @P4 int 
set @P4=98305 
declare @P5 int 
set @P5=0 
exec sp_cursorprepexec @P1 output, @P2 output, NULL, N'SELECT "Tbl1002"."PositionID", ..... 
select @P1, @P2, @P3, @P4, @P5 

진짜 문제는 서버가 준비하는 또 다른 SQL 서버에 의해 요청 된 것을 SQL 문입니다.아래 트림, 그것은 말한다 :

SELECT 
    "Tbl1002"."PositionID" "Col1010", ... 
    ( SELECT "Expr1007" 
     FROM (
      SELECT "Expr1006","Expr1006" "Expr1007" 
      FROM (
      SELECT COUNT(*) "Expr1006" 
      FROM (
       SELECT 
        "Tbl1005"."EmployeeID" "Col1043", ... 
       FROM "CasinoHR"."dbo"."Employees" "Tbl1005" 
       WHERE "Tbl1005"."PositionID"="Tbl1002"."PositionID" 
      ) Qry1103 
     ) Qry1104 
     ) "Subquery_Source_Tbl" 
    ) "Expr1008" 
FROM "CasinoHR"."dbo"."Positions" "Tbl1002" 
WHERE "Tbl1002"."PositionID"={guid'D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7'}' 

그것은 지저분한 읽기,하지만 당신이 문제를 볼 수 있습니다, 그것은 몇 가지 중첩 된 파생 테이블 내부 Tbl1002 참조 할 것 :

WHERE "Tbl1005"."PositionID"="Tbl1002"."PositionID" 

하지만 밖에서 선언을; 끝에 :

FROM "CasinoHR"."dbo"."Positions" "Tbl1002" 

여기서 어떤 버전의 SQL Server를 사용합니까?

우리는 ("wclhr")를 조회하려고하는 "원격" 서버

가 SP4와 SQL 서버 2000입니다 : 쿼리를 실행하면

Microsoft SQL Server 2000 - 8.00.2066 (Intel X86) May 11 2012 18:41:14

, 우리는 SQL 서버 2005에서 시도했습니다, 및 SQL Server 2008 R2를 지원합니다. 두 서버가 SQL Server 2000 일 때 작동했습니다.

SQL Server 2005부터 시작하여 2008 R2를 계속 실행하면 SQL이 생성됩니다!

다른 것들을 우리가

이 놀라운 시도했습니다, 끔찍한 해킹을 실행하는 것입니다 :

2000 기계에 대한 잘못된 SQL을 생성에서 로컬 SQL 서버 2008 R2를 중지
SELECT TOP 99.999999 PERCENT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(1) 
     FROM WCLHR.CasinoHR.dbo.Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM WCLHR.CasinoHR.dbo.Positions P 

.

로컬 서버는 64 비트가 아니지만 upgraded the catalogs on SQL Server 2000 anyway입니다. 그것은 그것을 고치지 않았다.

원본 검색어가 잘못 표시되지 않았습니까?

@Damien 불신자는 범위 지정이 문제가 될 수 있다고 생각하지 않습니다. 안심 하셔도됩니다. 내 원래 쿼리가 제대로 SQL 끊다에 대한 2000 실행 :

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, 
    ( SELECT COUNT(*) 
     FROM Employees E 
     WHERE E.PositionID = P.PositionID 
    ) AS EmployeeCount 
FROM Positions P 
WHERE P.PositionID = '{D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7}' 

불행히도, SQL 서버 2,008분의 2,005/2008R2 최적화 프로그램은 해당 쿼리에 해당 쿼리를 변환 -하지만 불행히도 하나 Server 2000을 실행 할 수없는 SQL이 :

SELECT 
    Tbl1002.PositionID, 
    Tbl1002.Name AS PositionName, 
    Tbl1002.CompCommitteeMember, 
    ( SELECT RecordCount 
     FROM (
      SELECT COUNT(*) AS RecordCount 
      FROM (
       SELECT 
        Employees.EmployeeID 
       FROM Employees 
       WHERE Employees.PositionID=Tbl1002.PositionID 
      ) Qry1103 
     ) Qry1104 
    ) AS EmployeeCount 
FROM Positions Tbl1002 
WHERE Tbl1002.PositionID= 'D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7' 
는 는

어떤, SQL 서버 2000, 제공 :

Msg 107, Level 16, State 2, Line 12 
The column prefix 'Tbl1002' does not match with a table name or alias name used in the query. 

SQL 서버 2000는 상관 하위 쿼리와 범위 지정 문제를 갖고있는 것 같아요; SQL Server 2005에서 은 "개선됨"입니다.

보너스 독서

+0

직접 네 부분 이름 대신 OPENQUERY를 사용해 보셨습니까? – Lamak

+0

2005/2008 서버에서 2000 서버에 대한 LinkedServer 설정을 표시하십시오. – RBarryYoung

+0

쿼리를 보면'E.PositionID = '{D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7}' '로 변경할 수 있습니까? 외부 질의가 특정 PositionID를 찾는다는 사실을 고려해 볼 때, 서브 쿼리에서'JOIN'을 사용해야하는 이유는 무엇입니까? – shahkalpesh

답변

2

당신이 문제가 당신을 필요로 주위를 진정으로 해결하려고 노력하는 것 같습니다 부착 읽기 연결된 서버에서 상관 된 하위 쿼리가 발생하지 않도록 쿼리를 다시 구성합니다.

링크 된 테이블을 그룹화 된 선택 항목에 조인으로 포함시키고 해당 계산서의 집계 계산을 평가할 수 있습니다.

SELECT 
    P.Code, P.Name AS PositionName, P.CompCommitteeMember, Count(*) 
FROM Positions P 
Left Join Employees E on E.PositionID = P.PositionID 
WHERE P.PositionID = '{D1B0912D-B1A5-11D4-BBDD-0004ACC5B8A7}' 
group by P.Code, P.Name, P.CompCommitteeMember 
+0

* ""최적화 알고리즘 버그를 해결하기 위해 쿼리를 다시 작성하십시오. "*. 해당 서버를 5 개월 또는 6 개월 내에 2008 R2로 업그레이드 할 예정입니다. 그때까지는 우리는 그냥 충돌로 살 수 있기를 바랍니다. –

관련 문제